Documentation
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"),
                };

                match request.response {
                    Some(ref mut message) => {
                        message.message.payload = b"OK".to_vec();
                    }
                    _ => {}
                };
                return request;
            })
            .await
            .unwrap();
    });
}