This commit is contained in:
2021-09-06 10:00:16 +02:00
parent 05e6f2c373
commit 858589d832

View File

@@ -1,49 +1,127 @@
#[derive(Debug)]
enum Period {
Days(i32),
}
#[derive(Debug)] #[derive(Debug)]
enum ItemUsage { enum ItemUsage {
Singleton, Singleton,
Once, Once,
Periodic(i32), Periodic(Period),
} }
#[derive(Debug)] #[derive(Debug)]
struct PackageItem { struct PackageItem {
name: String, name: String,
usage: ItemUsage usage: ItemUsage,
} }
impl PackageItem { impl PackageItem {
fn new(name: String, usage: ItemUsage) -> PackageItem { fn new(name: String, usage: ItemUsage) -> PackageItem {
PackageItem{ PackageItem {
name: name, name: name,
usage: usage, usage: usage,
} }
} }
} }
struct PackageList<'a> { #[derive(Debug)]
enum TripItemStatus {
Pending,
Ready,
Packed,
}
#[derive(Debug)]
struct TripItem<'a> {
package_item: &'a PackageItem,
status: TripItemStatus,
}
impl TripItem<'_> {
fn from_package_item(package_item: &PackageItem) -> TripItem {
TripItem {
package_item: package_item,
status: TripItemStatus::Pending,
}
}
}
#[derive(Debug)]
struct PackageList {
name: String, name: String,
items: &'a[PackageItem], items: Vec<PackageItem>,
}
#[derive(Debug)]
struct TripList<'a> {
items: Vec<TripItem<'a>>,
}
impl<'a> TripList<'a> {
fn from_package_list(list: &'a PackageList) -> TripList<'a> {
TripList {
items: vec![TripItem::from_package_item(&list.items[0])],
}
}
}
#[derive(Debug)]
struct Trip<'a> {
name: String,
date: String,
list: TripList<'a>,
}
impl<'a> Trip<'a> {
fn from_package_list(name: String, date: String, list: &'a PackageList) -> Trip<'a> {
Trip {
name: name,
date: date,
list: TripList::from_package_list(list),
}
}
} }
fn main() { fn main() {
let package_list_camping = PackageList { let package_list_camping = PackageList {
name: String::from("camping"), name: String::from("camping"),
items: &[ items: vec![
PackageItem::new(String::from("Rucksack"), ItemUsage::Singleton),
PackageItem::new(String::from("Schlafsack"), ItemUsage::Singleton), PackageItem::new(String::from("Schlafsack"), ItemUsage::Singleton),
PackageItem::new(String::from("Zelt"), ItemUsage::Singleton), PackageItem::new(String::from("Zelt"), ItemUsage::Singleton),
PackageItem::new(String::from("Luftmatratze"), ItemUsage::Singleton), PackageItem::new(String::from("Luftmatratze"), ItemUsage::Singleton),
PackageItem::new(String::from("Campingstuhl"), ItemUsage::Singleton), PackageItem::new(String::from("Campingstuhl"), ItemUsage::Singleton),
PackageItem::new(String::from("Regenjacke"), ItemUsage::Singleton), PackageItem::new(String::from("Regenjacke"), ItemUsage::Singleton),
PackageItem::new(String::from("Tasse"), ItemUsage::Singleton), PackageItem::new(String::from("Tasse"), ItemUsage::Singleton),
PackageItem::new(String::from("Trinkblase"), ItemUsage::Singleton),
PackageItem::new(String::from("Trinkflasche"), ItemUsage::Singleton),
PackageItem::new(String::from("Topf"), ItemUsage::Singleton), PackageItem::new(String::from("Topf"), ItemUsage::Singleton),
PackageItem::new(String::from("Messer"), ItemUsage::Singleton), PackageItem::new(String::from("Messer"), ItemUsage::Singleton),
PackageItem::new(String::from("Messer"), ItemUsage::Singleton), PackageItem::new(String::from("Messer"), ItemUsage::Singleton),
PackageItem::new(String::from("Unterhose"), ItemUsage::Periodic(1)), PackageItem::new(
String::from("Unterhose"),
ItemUsage::Periodic(Period::Days(1)),
),
], ],
}; };
println!("Contents for package list {:?}:", package_list_camping.name); println!("Contents of package list {:?}:", package_list_camping.name);
for item in package_list_camping.items { for item in &package_list_camping.items {
println!("{:?}", item);
}
println!("Now we're starting an actual trip!");
let trip = Trip::from_package_list(
String::from("Campingtrip"),
String::from("2021-09-06"),
&package_list_camping,
);
println!("Package list for trip {:?} at {:?}:", trip.name, trip.date);
for item in &trip.list.items {
println!("{:?}", item); println!("{:?}", item);
} }
} }