WIP
This commit is contained in:
1097
api/Cargo.lock
generated
1097
api/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -4,3 +4,8 @@ version = "0.1.0"
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
warp = "0.3"
|
||||||
|
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
serde_json = "1.0"
|
||||||
|
|||||||
208
api/src/main.rs
208
api/src/main.rs
@@ -1,10 +1,10 @@
|
|||||||
use std::collections::HashMap;
|
use serde::ser::{Serialize, SerializeStruct, Serializer};
|
||||||
|
use warp::Filter;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Duration {
|
enum Duration {
|
||||||
|
None,
|
||||||
Days(i32),
|
Days(i32),
|
||||||
Weeks(i32),
|
|
||||||
Months(i32),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -17,7 +17,6 @@ enum Period {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum ItemUsage {
|
enum ItemUsage {
|
||||||
Singleton,
|
Singleton,
|
||||||
Once,
|
|
||||||
Periodic(Period),
|
Periodic(Period),
|
||||||
Infinite,
|
Infinite,
|
||||||
}
|
}
|
||||||
@@ -85,6 +84,21 @@ impl PackageItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Serialize for PackageItem {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
let mut state = serializer.serialize_struct("PackageItem", 5)?;
|
||||||
|
state.serialize_field("name", &self.name)?;
|
||||||
|
state.serialize_field("size", &self.size)?;
|
||||||
|
state.serialize_field("count", &self.count)?;
|
||||||
|
state.serialize_field("usage", &self.usage)?;
|
||||||
|
state.serialize_field("preparation", &self.preparation)?;
|
||||||
|
state.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum TripItemStatus {
|
enum TripItemStatus {
|
||||||
Pending,
|
Pending,
|
||||||
@@ -114,7 +128,25 @@ impl TripItem<'_> {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct PackageList {
|
struct PackageList {
|
||||||
name: String,
|
name: String,
|
||||||
items: HashMap<String, PackageItem>,
|
items: Vec<PackageItem>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PackageList {
|
||||||
|
fn new_from_items(name: String, items: Vec<PackageItem>) -> PackageList {
|
||||||
|
PackageList { name, items }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serialize for PackageList {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
let mut state = serializer.serialize_struct("PackageList", 2)?;
|
||||||
|
state.serialize_field("name", &self.name)?;
|
||||||
|
state.serialize_field("items", &self.items)?;
|
||||||
|
state.end()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -125,7 +157,7 @@ struct TripList<'a> {
|
|||||||
impl<'a> TripList<'a> {
|
impl<'a> TripList<'a> {
|
||||||
fn from_package_list(list: &'a PackageList) -> TripList<'a> {
|
fn from_package_list(list: &'a PackageList) -> TripList<'a> {
|
||||||
let mut items = Vec::new();
|
let mut items = Vec::new();
|
||||||
for (_, item) in &list.items {
|
for item in &list.items {
|
||||||
items.push(TripItem::from_package_item(item));
|
items.push(TripItem::from_package_item(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,12 +182,15 @@ impl<'a> Trip<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn get_lists() -> Vec<PackageList> {
|
||||||
let items = vec![
|
let lists = vec![
|
||||||
// Base
|
PackageList::new_from_items(
|
||||||
|
String::from("EDC"),
|
||||||
|
vec![
|
||||||
PackageItem::new_simple(String::from("Rucksack")),
|
PackageItem::new_simple(String::from("Rucksack")),
|
||||||
PackageItem::new_simple(String::from("Regenhülle für Rucksack")),
|
PackageItem::new_simple(String::from("Regenhülle für Rucksack")),
|
||||||
PackageItem::new_simple(String::from("Normale Schuhe")),
|
PackageItem::new_simple(String::from("Normale Schuhe")),
|
||||||
|
PackageItem::new_simple(String::from("Taschenmesser")),
|
||||||
PackageItem::new(
|
PackageItem::new(
|
||||||
String::from("Taschentücher"),
|
String::from("Taschentücher"),
|
||||||
ItemSize::Pack(1),
|
ItemSize::Pack(1),
|
||||||
@@ -191,8 +226,11 @@ fn main() {
|
|||||||
Preparation::None,
|
Preparation::None,
|
||||||
),
|
),
|
||||||
PackageItem::new_simple(String::from("Ladekabel")),
|
PackageItem::new_simple(String::from("Ladekabel")),
|
||||||
//
|
],
|
||||||
// Geld & Karten
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Geld & Karten"),
|
||||||
|
vec![
|
||||||
PackageItem::new(
|
PackageItem::new(
|
||||||
String::from("Bargeld"),
|
String::from("Bargeld"),
|
||||||
ItemSize::Name(String::from("Euro")),
|
ItemSize::Name(String::from("Euro")),
|
||||||
@@ -214,8 +252,11 @@ fn main() {
|
|||||||
PackageItem::new_simple(String::from("Führerschein")),
|
PackageItem::new_simple(String::from("Führerschein")),
|
||||||
PackageItem::new_simple(String::from("Internationaler Führerschein")),
|
PackageItem::new_simple(String::from("Internationaler Führerschein")),
|
||||||
PackageItem::new_simple(String::from("Tagebuch")),
|
PackageItem::new_simple(String::from("Tagebuch")),
|
||||||
//
|
],
|
||||||
// Waschzeug
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Waschzeug"),
|
||||||
|
vec![
|
||||||
PackageItem::new_simple(String::from("Waschbeutel")),
|
PackageItem::new_simple(String::from("Waschbeutel")),
|
||||||
PackageItem::new_simple(String::from("Sonnencreme")),
|
PackageItem::new_simple(String::from("Sonnencreme")),
|
||||||
PackageItem::new_simple(String::from("After-Sun")),
|
PackageItem::new_simple(String::from("After-Sun")),
|
||||||
@@ -239,8 +280,11 @@ fn main() {
|
|||||||
),
|
),
|
||||||
PackageItem::new_simple(String::from("Deo")),
|
PackageItem::new_simple(String::from("Deo")),
|
||||||
PackageItem::new_simple(String::from("Duschgel / Shampoo")),
|
PackageItem::new_simple(String::from("Duschgel / Shampoo")),
|
||||||
//
|
],
|
||||||
// Apotheke
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Apotheke"),
|
||||||
|
vec![
|
||||||
PackageItem::new(
|
PackageItem::new(
|
||||||
String::from("Blasenpflaster"),
|
String::from("Blasenpflaster"),
|
||||||
ItemSize::Pack(1),
|
ItemSize::Pack(1),
|
||||||
@@ -283,14 +327,20 @@ fn main() {
|
|||||||
ItemUsage::Singleton,
|
ItemUsage::Singleton,
|
||||||
Preparation::None,
|
Preparation::None,
|
||||||
),
|
),
|
||||||
//
|
],
|
||||||
// Badesachen
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Badesachen"),
|
||||||
|
vec![
|
||||||
PackageItem::new_simple(String::from("Badehose")),
|
PackageItem::new_simple(String::from("Badehose")),
|
||||||
PackageItem::new_simple(String::from("Badehandtuch")),
|
PackageItem::new_simple(String::from("Badehandtuch")),
|
||||||
PackageItem::new_simple(String::from("Surfshirt (Lang)")),
|
PackageItem::new_simple(String::from("Surfshirt (Lang)")),
|
||||||
PackageItem::new_simple(String::from("Wasserschuhe")),
|
PackageItem::new_simple(String::from("Wasserschuhe")),
|
||||||
//
|
],
|
||||||
// Camping
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Camping"),
|
||||||
|
vec![
|
||||||
PackageItem::new_simple(String::from("Schlafsack")),
|
PackageItem::new_simple(String::from("Schlafsack")),
|
||||||
PackageItem::new_simple(String::from("Zelt")),
|
PackageItem::new_simple(String::from("Zelt")),
|
||||||
PackageItem::new_simple(String::from("Luftmatratze")),
|
PackageItem::new_simple(String::from("Luftmatratze")),
|
||||||
@@ -354,21 +404,37 @@ fn main() {
|
|||||||
ItemUsage::Periodic(Period::Weekly(1)),
|
ItemUsage::Periodic(Period::Weekly(1)),
|
||||||
Preparation::None,
|
Preparation::None,
|
||||||
),
|
),
|
||||||
//
|
],
|
||||||
// Essen
|
),
|
||||||
PackageItem::new(
|
PackageList::new_from_items(
|
||||||
|
String::from("Essen"),
|
||||||
|
vec![PackageItem::new(
|
||||||
String::from("Kaffee"),
|
String::from("Kaffee"),
|
||||||
ItemSize::Grams(100),
|
ItemSize::Grams(100),
|
||||||
1,
|
1,
|
||||||
ItemUsage::Periodic(Period::Days(3)),
|
ItemUsage::Periodic(Period::Days(3)),
|
||||||
Preparation::None,
|
Preparation::None,
|
||||||
|
)],
|
||||||
),
|
),
|
||||||
//
|
PackageList::new_from_items(
|
||||||
// Wanderzeug
|
String::from("Wanderzeug"),
|
||||||
|
vec![
|
||||||
PackageItem::new_simple(String::from("Wanderschuhe")),
|
PackageItem::new_simple(String::from("Wanderschuhe")),
|
||||||
PackageItem::new_simple(String::from("Trinkblase")),
|
PackageItem::new(
|
||||||
//
|
String::from("Trinkblase"),
|
||||||
// Klamotten
|
ItemSize::None,
|
||||||
|
1,
|
||||||
|
ItemUsage::Singleton,
|
||||||
|
Preparation::Steps(vec![PreparationStep::new(
|
||||||
|
String::from("Auffüllen"),
|
||||||
|
Duration::None,
|
||||||
|
)]),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Klamotten"),
|
||||||
|
vec![
|
||||||
PackageItem::new(
|
PackageItem::new(
|
||||||
String::from("Cap"),
|
String::from("Cap"),
|
||||||
ItemSize::None,
|
ItemSize::None,
|
||||||
@@ -439,8 +505,19 @@ fn main() {
|
|||||||
ItemUsage::Periodic(Period::Days(2)),
|
ItemUsage::Periodic(Period::Days(2)),
|
||||||
Preparation::None,
|
Preparation::None,
|
||||||
),
|
),
|
||||||
//
|
PackageItem::new_simple(String::from("Schmutzwäschebeutel")),
|
||||||
// Misc
|
],
|
||||||
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Geld & Karten"),
|
||||||
|
vec![
|
||||||
|
PackageItem::new_simple(String::from("Fahrrad")),
|
||||||
|
PackageItem::new_simple(String::from("Fahrradhelm")),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
PackageList::new_from_items(
|
||||||
|
String::from("Geld & Karten"),
|
||||||
|
vec![
|
||||||
PackageItem::new_simple(String::from("Trinkflasche")),
|
PackageItem::new_simple(String::from("Trinkflasche")),
|
||||||
PackageItem::new_simple(String::from("Dyneemaschnur")),
|
PackageItem::new_simple(String::from("Dyneemaschnur")),
|
||||||
PackageItem::new_simple(String::from("Ladegerät")),
|
PackageItem::new_simple(String::from("Ladegerät")),
|
||||||
@@ -471,37 +548,58 @@ fn main() {
|
|||||||
PackageItem::new_simple(String::from("Ersatzbrille")),
|
PackageItem::new_simple(String::from("Ersatzbrille")),
|
||||||
PackageItem::new_simple(String::from("Sonnenbrille")),
|
PackageItem::new_simple(String::from("Sonnenbrille")),
|
||||||
PackageItem::new_simple(String::from("Ohrenstöpsel")),
|
PackageItem::new_simple(String::from("Ohrenstöpsel")),
|
||||||
|
],
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
let package_list_camping = PackageList {
|
lists
|
||||||
name: String::from("camping"),
|
|
||||||
items: (0..items.len()).map(|i| i.to_string()).zip(items).collect(),
|
|
||||||
};
|
|
||||||
|
|
||||||
println!("Contents of package list {:?}:", package_list_camping.name);
|
// for list in &lists {
|
||||||
for item in &package_list_camping.items {
|
// println!("Contents of package list {:?}:", list.name);
|
||||||
println!("{:?}", item);
|
// for item in &list.items {
|
||||||
}
|
// println!("\t{:?}", item);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
println!("\nNow we're starting an actual trip!");
|
// println!("\nNow we're starting an actual trip!");
|
||||||
|
|
||||||
let mut trip = Trip::from_package_list(
|
// let mut trip = Trip::from_package_list(
|
||||||
String::from("Campingtrip"),
|
// String::from("Campingtrip"),
|
||||||
String::from("2021-09-06"),
|
// String::from("2021-09-06"),
|
||||||
&package_list_camping,
|
// &lists[0],
|
||||||
);
|
// );
|
||||||
|
|
||||||
println!(
|
// println!(
|
||||||
"\nPackage list for trip {:?} at {:?}:",
|
// "\nPackage list for trip {:?} at {:?}:",
|
||||||
trip.name, trip.date
|
// trip.name, trip.date
|
||||||
);
|
// );
|
||||||
for item in &trip.list.items {
|
// for item in &trip.list.items {
|
||||||
println!("{:?}", item);
|
// println!("{:?}", item);
|
||||||
}
|
// }
|
||||||
|
|
||||||
trip.list.items[0].set_status(TripItemStatus::Ready);
|
// trip.list.items[0].set_status(TripItemStatus::Ready);
|
||||||
trip.list.items[1].set_status(TripItemStatus::Packed);
|
// trip.list.items[1].set_status(TripItemStatus::Packed);
|
||||||
for item in &trip.list.items {
|
// for item in &trip.list.items {
|
||||||
println!("{:?}", item);
|
// println!("{:?}", item);
|
||||||
}
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
let accept_json = warp::header::exact("accept", "application/json");
|
||||||
|
|
||||||
|
let root = warp::path::end().map(|| "Hi");
|
||||||
|
let v1 = warp::path!("v1")
|
||||||
|
.and(warp::get())
|
||||||
|
.and(warp::path::end())
|
||||||
|
.map(warp::reply);
|
||||||
|
let lists = warp::path!("v1" / "lists")
|
||||||
|
.and(warp::path::end())
|
||||||
|
.and(warp::get())
|
||||||
|
.and(accept_json)
|
||||||
|
.map(|| warp::reply::json(&get_lists()));
|
||||||
|
|
||||||
|
let routes = root.or(v1).or(lists);
|
||||||
|
|
||||||
|
warp::serve(routes).run(([127, 0, 0, 1], 9000)).await;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user