commit aa40b8d58863c5dc523da6467bb1b27459ddbca1
parent e77b4bc6e5a705ef31d0de6f00dee739efdde8ce
Author: minerva-jupiter <ryouturn@gmail.com>
Date: Wed, 1 Apr 2026 10:38:25 +0900
feat(prime): Add prime number checking TCP server
Diffstat:
3 files changed, 120 insertions(+), 0 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
@@ -31,6 +31,12 @@ dependencies = [
]
[[package]]
+name = "itoa"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+
+[[package]]
name = "libc"
version = "0.2.183"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -46,6 +52,12 @@ dependencies = [
]
[[package]]
+name = "memchr"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+
+[[package]]
name = "mio"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -98,6 +110,8 @@ dependencies = [
name = "protohack"
version = "0.1.0"
dependencies = [
+ "serde",
+ "serde_json",
"tokio",
]
@@ -126,6 +140,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
+name = "serde"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.149"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+dependencies = [
+ "itoa",
+ "memchr",
+ "serde",
+ "serde_core",
+ "zmij",
+]
+
+[[package]]
name = "signal-hook-registry"
version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -216,3 +273,9 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
+
+[[package]]
+name = "zmij"
+version = "1.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
diff --git a/Cargo.toml b/Cargo.toml
@@ -4,4 +4,6 @@ version = "0.1.0"
edition = "2024"
[dependencies]
+serde = { version = "1.0.228", features = ["derive"] }
+serde_json = "1.0.149"
tokio = { version = "1.50", features = ["full"] }
diff --git a/src/bin/prime.rs b/src/bin/prime.rs
@@ -0,0 +1,55 @@
+use serde::{Deserialize, Serialize};
+use tokio::io::{AsyncBufReadExt, AsyncWriteExt};
+
+#[derive(Deserialize)]
+struct PrimeRequest {
+ method: String,
+ number: f64,
+}
+
+#[derive(Serialize)]
+struct PrimeResponse {
+ method: String,
+ is_prime: bool,
+}
+
+#[tokio::main]
+async fn main() -> std::io::Result<()> {
+ println!("Smoketest server has started");
+ let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await?;
+ loop {
+ let (mut socket, _) = listener.accept().await?;
+ tokio::spawn(async move {
+ let (rd, mut wr) = socket.split();
+ let mut reader = tokio::io::BufReader::new(rd).lines();
+ while let Ok(Some(line)) = reader.next_line().await {
+ let request: PrimeRequest = match serde_json::from_str::<PrimeRequest>(&line) {
+ Ok(r) if r.method == "isPrime" => r,
+ _ => continue,
+ };
+ let is_prime = is_prime(request.number);
+ let response = PrimeResponse {
+ method: "is_prime".to_string(),
+ is_prime,
+ };
+ let mut payload = serde_json::to_vec(&response).unwrap();
+ payload.push(b'\n');
+ if wr.write_all(&payload).await.is_err() {
+ break;
+ }
+ }
+ });
+ }
+}
+
+fn is_prime(n: f64) -> bool {
+ if n.fract() != 0.0 || n < 2.0 {
+ return false;
+ }
+ for i in 2..(n as u64) {
+ if n % i as f64 == 0.0 {
+ return false;
+ }
+ }
+ true
+}