p_rust 0.1.0

My rust practice
Documentation
#[derive(Debug)]
enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

#[derive(Debug)]
struct MoveMessage {
    x: i32,
    y: i32,
}

#[derive(Debug)]
enum Message {
    Quit,
    Move(MoveMessage),
    Write(String),
    ChangeColor(i32, i32, i32),
}

impl Message {
    fn call(&self) {
        println!("call: {:#?}", &self);
        println!("Quit: {:#?}", Message::Quit);

        let move_message = MoveMessage { x: 12, y: -11 };
        println!("Move x: {}, y: {}", move_message.x, move_message.y);
        let move_enum = Message::Move(move_message);
        println!("move_enum: {:#?}", move_enum);

        let change_color_enum = Message::ChangeColor(1, 32, 3);
        println!("change_color_enum: {:#?}", change_color_enum);
    }
    fn call2(&self) {
        println!("call2: {:#?}", &self);
    }
}

// struct QuiteMessage; // unit struct
// struct MoveMessage {
//     x: i32,
//     y: i32,
// }
//
// struct WriteMessage(String); // tuple struct
// struct ChangeColorMessage(i32, i32, i32); //tuple struct

#[derive(Debug)] // so we can inspect the state in a minute
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

enum Coin {
    Penny,
    Nickle,
    Dime,
    Quarter(UsState),
}

fn values_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => {
            println!("Lucky penny!");
            1
        }
        Coin::Nickle => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        }
    }
}

fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        Some(i) => Some(i + 1),
        None => None
    }
}

fn main() {
    {
        let home = IpAddr::V4(127, 0, 0, 1);
        let loopback = IpAddr::V6(String::from("::1"));
        println!("home: {:#?}", home);
        println!("loopback: {:#?}", loopback);

        let m = Message::Write(String::from("hello"));
        m.call();
        m.call2();
    }

    {
        let some_number = Some(5);
        let some_string = Some("a string");
        println!("some_number: {:#?}, some_string: {:#?}", some_number, some_string);

        let absent_number: Option<i32> = None;
        println!("absent_number: {:#?}", absent_number);

        let x: i8 = 5;
        let y: Option<i8> = Some(5);

        let sum = x + y.unwrap();
        println!("sum: {}", sum);
    }

    {
        values_in_cents(Coin::Quarter(UsState::Alaska));
        values_in_cents(Coin::Quarter(UsState::Alabama));
        values_in_cents(Coin::Penny);
        values_in_cents(Coin::Nickle);
        values_in_cents(Coin::Dime);

        let five = Some(5);
        let six = plus_one(five);
        let none = plus_one(None);
        println!("five: {:?}, six: {:?}, none: {:?}", five, six, none);
    }

    {
        fn add_fancy_hat() {}
        fn remove_fancy_hat() {}

        let dice_roll = 9;
        match dice_roll {
            3 => add_fancy_hat(),
            7 => remove_fancy_hat(),
            _ => ()
        }
    }

    {
        let config_max = Some(236u8);
        match config_max {
            Some(max) => println!("The maximum is configured to be {}", max),
            _ => ()
        }

        if let Some(max) = Some(127u8) {
            println!("The maximum is configured to be {}", max);
        }
    }

    {
        let coin = Coin::Penny;
        let mut count = 0;
        match coin {
            Coin::Quarter(state) => println!("State quarter from {:?}!", state),
            _ => count += 1
        }
        println!("count: {}", count);

        let coin = Coin::Quarter(UsState::Alaska);
        if let Coin::Quarter(state) = coin {
            println!("State quarter from {:?}!", state);
        } else {
            count += 1;
        }
        println!("count: {}", count);
    }
}