summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exercises/structs/structs3.rs67
-rw-r--r--info.toml13
2 files changed, 80 insertions, 0 deletions
diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs
new file mode 100644
index 0000000..77cc154
--- /dev/null
+++ b/exercises/structs/structs3.rs
@@ -0,0 +1,67 @@
+// structs3.rs
+// Structs contain more than simply some data, they can also have logic, in this
+// exercise we have defined the Package struct and we want to test some logic attached to it,
+// make the code compile and the tests pass! If you have issues execute `rustlings hint structs3`
+
+// I AM NOT DONE
+
+#[derive(Debug)]
+struct Package {
+ from: String,
+ to: String,
+ weight: f32
+}
+
+impl Package {
+ fn new(from: String, to: String, weight: f32) -> Package {
+ if weight <= 0.0 {
+ // Something goes here...
+ } else {
+ return Package {from, to, weight};
+ }
+ }
+
+ fn is_international(&self) -> ??? {
+ // Something goes here...
+ }
+
+ fn get_fees(&self, cost_per_kg: f32) -> ??? {
+ // Something goes here...
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ #[should_panic]
+ fn fail_creating_weightless_package() {
+ let country_from = String::from("Spain");
+ let country_to = String::from("Austria");
+
+ Package::new(country_from, country_to, -2.21);
+ }
+
+ #[test]
+ fn create_international_package() {
+ let country_from = String::from("Spain");
+ let country_to = String::from("Russia");
+
+ let package = Package::new(country_from, country_to, 1.2);
+
+ assert!(package.is_international());
+ }
+
+ #[test]
+ fn calculate_transport_fees() {
+ let country_from = String::from("Spain");
+ let country_to = String::from("Spain");
+
+ let country_fee = ???;
+
+ let package = Package::new(country_from, country_to, 22.0);
+
+ assert_eq!(package.get_fees(country_fee), 176.0);
+ }
+}
diff --git a/info.toml b/info.toml
index e852ad0..89a669c 100644
--- a/info.toml
+++ b/info.toml
@@ -241,6 +241,19 @@ Creating instances of structs is easy, all you need to do is assign some values
There is however some shortcuts that can be taken when instantiating structs.
Have a look in The Book, to find out more: https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax"""
+[[exercises]]
+name = "structs3"
+path = "exercises/structs/structs3.rs"
+mode = "test"
+hint = """
+The new method needs to panic if the weight is physically impossible :), how do we do that in Rust?
+
+For is_international: What makes a package international? Seems related to the places it goes through right?
+
+For calculate_transport_fees: Bigger is more expensive usually, we don't have size, but something may fit the bill here :)
+
+Have a look in The Book, to find out more about method implementations: https://doc.rust-lang.org/book/ch05-03-method-syntax.html"""
+
# STRINGS
[[exercises]]