diff --git a/README.md b/README.md index 6f447aa..19d8c06 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,6 @@ Bingo card web application Backend `Rust` @benjamyn -Frontend `TBD` @balgie +Frontend `React` @balgie Docs `MD files` @here diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/backend/Cargo.toml b/backend/Cargo.toml index f781829..bc848ea 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -6,3 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +glob = "0.3.1" +serde = { version = "1.0.215", features = ["serde_derive"] } +serde_json = "1.0.133" +toml = "0.8.19" +untildify = "0.1.1" diff --git a/backend/src/config.rs b/backend/src/config.rs new file mode 100644 index 0000000..ec8b3cb --- /dev/null +++ b/backend/src/config.rs @@ -0,0 +1,18 @@ +use serde::Deserialize; +use untildify::untildify; + +use crate::files; + +#[derive(Deserialize)] +pub struct Config { + pub config_dir: String, +} + +impl Config { + pub fn load() -> Config { + let config_contents = files::load_file_contents(untildify("~/.config/bingobongo.toml")); + let config: Config = toml::from_str(config_contents.as_str()).unwrap(); + + return config; + } +} diff --git a/backend/src/files.rs b/backend/src/files.rs new file mode 100644 index 0000000..e1edfc4 --- /dev/null +++ b/backend/src/files.rs @@ -0,0 +1,34 @@ +use glob::glob; +use std::fs::File; +use std::io::prelude::*; + +pub fn load_file_contents(file_path: String) -> String { + let file = File::open(file_path); + match file { + Ok(mut f) => { + let mut contents = String::new(); + f.read_to_string(&mut contents).unwrap(); + return contents; + } + Err(e) => { + return e.to_string(); + } + } +} + +pub fn list_files(path: String, extension: String) -> Vec { + let mut tmp_path = path.clone(); + let mut files = Vec::::new(); + let glob_path = format!("{}/*.{}", tmp_path, extension); + // tmp_path.push_str(&glob_path); + // println!("{}", glob_path); + + for entry in glob(&glob_path).unwrap() { + match entry { + Ok(p) => files.push(String::from(p.display().to_string())), + Err(e) => return vec![String::new()], + } + } + + return files; +} diff --git a/backend/src/main.rs b/backend/src/main.rs index e7a11a9..218b206 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -1,3 +1,25 @@ +mod config; +use config::Config; +mod files; +use files::*; +mod structs; +use structs::*; + fn main() { - println!("Hello, world!"); + let config = Config::load(); + + let pool = structs::BingoPool::load_from_file(String::from( + "/home/ben/Documents/Projects/rust/BingoBongo/backend/workingdir/pools/testdata.toml", + )); + + // let pools = BingoPools::load_pools(); + + let files = files::list_files( + String::from("/home/ben/Documents/Projects/rust/BingoBongo/backend/workingdir/pools"), + String::from("toml"), + ); + + println!("{:?}", files); + + println!("{}", pool); } diff --git a/backend/src/structs.rs b/backend/src/structs.rs new file mode 100644 index 0000000..e40ccea --- /dev/null +++ b/backend/src/structs.rs @@ -0,0 +1,87 @@ +use core::fmt; +use serde::Deserialize; + +use crate::files; + +#[derive(Deserialize)] +pub struct BingoSquare { + option: String, +} + +impl BingoSquare { + pub fn new(option: String) -> BingoSquare { + BingoSquare { option } + } +} + +#[derive(Deserialize)] +pub struct Meta { + name: String, + description: String, +} + +impl Meta { + pub fn new(name: String, description: String) -> Meta { + Meta { name, description } + } +} + +#[derive(Deserialize)] +pub struct BingoPool { + meta: Meta, + squares: Vec, +} + +impl fmt::Display for BingoPool { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Name: {}\n", self.meta.name).unwrap(); + write!(f, "Description: {}\n\n", self.meta.description).unwrap(); + for square in &self.squares { + write!(f, "Square: {}\n", square.option).unwrap(); + } + write!(f, "") + } +} + +impl BingoPool { + pub fn new() -> BingoPool { + BingoPool { + meta: Meta::new(String::from("Meme"), String::from("Funny")), + squares: Vec::::new(), + } + } + + pub fn load_from_file(file_path: String) -> BingoPool { + let file_contents = files::load_file_contents(file_path); + let bingopool: BingoPool = toml::from_str(&file_contents).expect("Syntax error in toml"); + return bingopool; + } +} + +pub struct BingoPools { + pools: Vec, +} + +impl BingoPools { + pub fn load_pools() -> BingoPools { + BingoPools { + pools: Vec::::new(), + } + } +} + +pub struct BingoBoard { + size: i64, + squares: Vec, +} + +impl BingoBoard { + pub fn new(size: i64) -> BingoBoard { + BingoBoard { + size: size, + squares: Vec::::new(), + } + } + + pub fn init(&self) {} +} diff --git a/backend/workingdir/pools/testdata.toml b/backend/workingdir/pools/testdata.toml new file mode 100644 index 0000000..fa05d6e --- /dev/null +++ b/backend/workingdir/pools/testdata.toml @@ -0,0 +1,18 @@ +[meta] +name = 'Name of pool' +description = 'Description of pool' + +[[squares]] +option = 'First square' + +[[squares]] +option = 'Second square' + +[[squares]] +option = 'Third square' + +[[squares]] +option = 'Fourth square' + +[[squares]] +option = 'Fifth square' diff --git a/docs/Super_serious_design_docs.kra b/docs/Super_serious_design_docs.kra new file mode 100644 index 0000000..74b82ec Binary files /dev/null and b/docs/Super_serious_design_docs.kra differ diff --git a/docs/Super_serious_design_docs.png b/docs/Super_serious_design_docs.png new file mode 100644 index 0000000..2a877ed Binary files /dev/null and b/docs/Super_serious_design_docs.png differ