diff --git a/Cargo.toml b/Cargo.toml index 3fcda58..1b8b9cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,3 +4,6 @@ version = "0.1.0" authors = ["Tsuyoshi Maeda "] [dependencies] +serde = "1.0.23" +serde_derive = "1.0.23" +serde_json = "1.0.7" \ No newline at end of file diff --git a/src/helpers/math.rs b/src/helpers/math.rs new file mode 100644 index 0000000..075b3f9 --- /dev/null +++ b/src/helpers/math.rs @@ -0,0 +1,13 @@ +pub fn add(a: i32, b: i32) -> i32 { + a + b +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_add() { + assert_eq!(1 + 2, add(1, 2)); + } +} \ No newline at end of file diff --git a/src/helpers/mod.rs b/src/helpers/mod.rs new file mode 100644 index 0000000..019ce55 --- /dev/null +++ b/src/helpers/mod.rs @@ -0,0 +1,2 @@ +pub mod math; +pub mod output; \ No newline at end of file diff --git a/src/helpers/output.rs b/src/helpers/output.rs new file mode 100644 index 0000000..2081035 --- /dev/null +++ b/src/helpers/output.rs @@ -0,0 +1,15 @@ +pub fn string(input: &str) -> () { + println!("{}", input); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_output_string() { + // Expected no error. + string("abc"); + assert!(true); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 31e1bb2..e774833 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,4 @@ -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 4); - } -} +#[macro_use] extern crate serde_derive; + +pub mod helpers; +pub mod models; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 218a5fb..5700cde 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,13 @@ +extern crate cc2_rust_workshop; +extern crate serde_json; + +use cc2_rust_workshop::models::person::{Person}; +use cc2_rust_workshop::helpers::math; +use cc2_rust_workshop::helpers::output; + fn main() { + // Basic requirement parts. + let number_1 = 1; println!("{}", number_1); @@ -6,10 +15,10 @@ fn main() { number_2 += 1; println!("{}", number_2); - let number_3 = add(1, 2); + let number_3 = math::add(1, 2); println!("{}", number_3); - output_string("this is input value"); + output::string("this is input value"); let person = Person::new( "Code", @@ -18,63 +27,29 @@ fn main() { ); println!("{:?}", person); person.greet(); -} - -fn add(a: i32, b: i32) -> i32 { - a + b -} -#[test] -fn it_add() { - assert_eq!(1 + 2, add(1, 2)); -} -fn output_string(input: &str) -> () { - println!("{}", input); -} -#[test] -fn it_output_string() { - // Expected no error. - output_string("abc"); - assert!(true); -} + // Advanced requirements parts. -#[derive(Debug)] -struct Person { - first_name: String, - last_name: String, - age: u8 -} + // Convert the Point to a JSON string. + let serialized_person = serde_json::to_string(&person).unwrap(); + println!("serialized_person = {}", serialized_person); -impl Person { - fn new(first_name: &str, last_name: &str, age: u8) -> Person { - Person { - first_name: first_name.to_string(), - last_name: last_name.to_string(), - age: age - } - } + // Convert the JSON string back to a Person. + let deserialized_person: Person = serde_json::from_str(&serialized_person).unwrap(); + println!("deserialized_person = {:?}", deserialized_person); - fn greet(&self) -> () { - println!( - "My name is {} {}. I'm {} years old.", - &self.first_name, - &self.last_name, - &self.age + let mut persons: Vec = vec![]; + for i in 0..5 { + let person = Person::new( + &format!("FN_{}", i), + &format!("LN_{}", i), + i ); + persons.push(person); + } + println!("{}", persons.len()); + for p in persons { + // If you use {:#?} instead of {:?}, the format becomes more readable. + println!("{:#?}", p); } -} -#[test] -fn it_person() { - let person = Person::new("FN", "LN", 1); - assert_eq!("FN", person.first_name); - assert_eq!("LN", person.last_name); - assert_eq!(1, person.age); -} -#[test] -fn it_person_greet() { - let person = Person::new("FN", "LN", 1); - - // Expected no error. - person.greet(); - assert!(true); } \ No newline at end of file diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 0000000..c61d2e3 --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1 @@ +pub mod person; \ No newline at end of file diff --git a/src/models/person.rs b/src/models/person.rs new file mode 100644 index 0000000..8f324eb --- /dev/null +++ b/src/models/person.rs @@ -0,0 +1,46 @@ +#[derive(Serialize, Deserialize, Debug)] +pub struct Person { + first_name: String, + last_name: String, + age: u8 +} + +impl Person { + pub fn new(first_name: &str, last_name: &str, age: u8) -> Person { + Person { + first_name: first_name.to_string(), + last_name: last_name.to_string(), + age: age + } + } + + pub fn greet(&self) -> () { + println!( + "My name is {} {}. I'm {} years old.", + &self.first_name, + &self.last_name, + &self.age + ); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_person() { + let person = Person::new("FN", "LN", 1); + assert_eq!("FN", person.first_name); + assert_eq!("LN", person.last_name); + assert_eq!(1, person.age); + } + #[test] + fn it_person_greet() { + let person = Person::new("FN", "LN", 1); + + // Expected no error. + person.greet(); + assert!(true); + } +} \ No newline at end of file