extern crate coap;

use std::net::SocketAddr;

use coap::Server;
use coap_lite::CoapRequest;
use coap_lite::RequestType as Method;
use tokio::runtime::Runtime;

fn main() {
    let addr = "127.0.0.1:5683";

    Runtime::new().unwrap().block_on(async move {
        let server = Server::new_udp(addr).unwrap();
        println!("Server up on {}", addr);

        server
            .run(|mut request: Box<CoapRequest<SocketAddr>>| async move {
                match *request.get_method() {
                    Method::Get => println!("request by get {}", request.get_path()),
                    Method::Post => println!(
                        "request by post {}",
                        String::from_utf8(request.message.payload.clone()).unwrap()
                    ),
                    Method::Put => println!(
                        "request by put {}",
                        String::from_utf8(request.message.payload.clone()).unwrap()
                    ),
                    _ => println!("request by other method"),
                };

                if let Some(ref mut message) = request.response {
                    message.message.payload = b"OK".to_vec();
                };
                request
            })
            .await
            .unwrap();
    });
}
