protohack

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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 }