toe-beans 0.10.0

DHCP library, client, and server
Documentation
//! This is a CLI application that uses the Client module of this crate's library.
//!
//! This binary is only built if the `v4_client` feature is enabled.
//! The `v4_client` feature is enabled by default.

use clap::Parser;
use env_logger::{Builder, Env};
use log::info;
use std::{
    net::{Ipv4Addr, SocketAddrV4},
    time::Instant,
};
use toe_beans::v4::{Arguments, Client, ClientConfig, Commands, Message, RESOLVED_SERVER_PORT};

fn main() {
    let now = Instant::now();
    Builder::from_env(Env::default().default_filter_or("info")).init();

    let args = Arguments::parse();
    let config = match args.client_config {
        Some(client_config) => client_config.merge(ClientConfig::default()),
        None => ClientConfig::default(),
    };

    let server_address = SocketAddrV4::new(Ipv4Addr::LOCALHOST, RESOLVED_SERVER_PORT);
    let mut client = Client::new(&config);

    match &args.command {
        Commands::Dora {} => {
            let message = client.discover();
            info!("Sending discover message");
            client
                .socket
                .broadcast(&message, RESOLVED_SERVER_PORT)
                .unwrap();

            info!("Waiting for offer message");
            let (offer, _src) = client.socket.receive().unwrap();
            info!("Received offer message");

            let message = client.request(offer);
            info!("Sending request message");
            client
                .socket
                .broadcast(&message, RESOLVED_SERVER_PORT)
                .unwrap();

            info!("Waiting for ack message");
            let (ack, _src) = client.socket.receive::<Message>().unwrap();
            info!("Received ack message");

            info!("Your ip address: {:?}", ack.yiaddr);
        }
        Commands::Release {} => {
            let message = client.release();
            info!("Sending release message");
            client.socket.unicast(&message, server_address).unwrap();
        }
        Commands::Inform {} => {
            let message = client.inform(Vec::new());
            info!("Sending inform message");
            client.socket.unicast(&message, server_address).unwrap();
        }
        Commands::Decline {} => todo!("Send a decline request"),
    }

    info!("Completed in {} microseconds", now.elapsed().as_micros());
}