From 34487833bdec3aeb42c4db7300cb3eaf8a6945cf Mon Sep 17 00:00:00 2001 From: Caleb Webber Date: Tue, 5 Mar 2024 20:49:03 -0500 Subject: [PATCH] start is_prime challenge --- Cargo.lock | 82 +++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ src/bin/is_prime.rs | 70 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 src/bin/is_prime.rs diff --git a/Cargo.lock b/Cargo.lock index b09b82e..d50d737 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,88 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + [[package]] name = "protohackers" version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/Cargo.toml b/Cargo.toml index 3f2d7a4..c6aef4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,5 @@ edition = "2021" name = "smoke" [dependencies] +serde = { version = "1.0.197", features = ["serde_derive"] } +serde_json = "1.0.114" diff --git a/src/bin/is_prime.rs b/src/bin/is_prime.rs new file mode 100644 index 0000000..ee14d75 --- /dev/null +++ b/src/bin/is_prime.rs @@ -0,0 +1,70 @@ +use std::{io::{Read, Write}, net::TcpListener}; +use serde::{Serialize, Deserialize}; +use serde_json; + +const PORT: usize = 10000; +const BUFF_SIZE: usize = 1; + +#[derive(Deserialize, Debug)] +struct Request { + method: String, + number: f32 +} + +#[derive(Serialize, Debug)] +struct Response { + method: String, + prime: bool +} + +fn main() -> std::io::Result<()> { + + let listener = TcpListener::bind(format!("0.0.0.0:{PORT}"))?; + + for stream in listener.incoming() { + std::thread::spawn(move || { + match stream { + Ok(mut stream) => { + let mut big_buf: Vec = vec![]; + loop { + let mut buf: [u8; BUFF_SIZE] = [0; BUFF_SIZE]; + + if let Ok(_) = stream.read_exact(&mut buf) { + println!("{:?}", buf); + match buf { + [10] => { + println!("got newline"); + let s = String::from_utf8(big_buf.clone()).unwrap(); + let d = serde_json::from_str::(&s); + match d { + Ok(message) => { + let response = Response { + method: String::from("isPrime"), + prime: false + }; + let res_str = serde_json::to_string(&response).unwrap(); + let _ = stream.write(&res_str.as_bytes()); + }, + Err(e) => { + println!("Error parsing\n{:?}", e); + } + } + let _ = stream.write(&buf); + }, + [n] => { + println!("read {n}"); + big_buf.push(n); + } + } + } else { + break; + } + } + }, + Err(e) => panic!("{:?}", e) + } + }); + } + + Ok(()) +}