prime.rs (1759B)
1 use serde::{Deserialize, Serialize}; 2 use tokio::io::{AsyncBufReadExt, AsyncWriteExt}; 3 4 #[derive(Deserialize)] 5 struct PrimeRequest { 6 method: String, 7 number: f64, 8 } 9 10 #[derive(Serialize)] 11 struct PrimeResponse { 12 method: String, 13 prime: bool, 14 } 15 16 #[tokio::main] 17 async fn main() -> std::io::Result<()> { 18 println!("Smoketest server has started"); 19 let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await?; 20 loop { 21 let (mut socket, _) = listener.accept().await?; 22 tokio::spawn(async move { 23 let (rd, mut wr) = socket.split(); 24 let mut reader = tokio::io::BufReader::new(rd).lines(); 25 while let Ok(Some(line)) = reader.next_line().await { 26 let request: PrimeRequest = match serde_json::from_str::<PrimeRequest>(&line) { 27 Ok(r) if r.method == "isPrime" => r, 28 _ => return, 29 }; 30 let is_prime = is_prime(request.number); 31 let response = PrimeResponse { 32 method: "isPrime".to_string(), 33 prime: is_prime, 34 }; 35 let mut payload = serde_json::to_vec(&response).unwrap(); 36 payload.push(b'\n'); 37 if wr.write_all(&payload).await.is_err() { 38 break; 39 } 40 } 41 }); 42 } 43 } 44 45 fn is_prime(n: f64) -> bool { 46 if n.fract() != 0.0 || n < 2.0 { 47 return false; 48 } else if n == 2.0 { 49 return true; 50 } else if n % 2.0 == 0.0 { 51 return false; 52 } else { 53 let mut i = 3.0; 54 while i * i <= n { 55 if n % i == 0.0 { 56 return false; 57 } 58 i += 2.0; 59 } 60 true 61 } 62 }