diff --git a/src/cli/commands/day007.rs b/src/cli/commands/day007.rs index d3a26ec..c39e4a5 100644 --- a/src/cli/commands/day007.rs +++ b/src/cli/commands/day007.rs @@ -1,14 +1,99 @@ -use std::path::PathBuf; -use std::fs::File; -use std::io::{BufReader,Lines}; use crate::util::read_lines; +use std::cell::{Ref, RefCell}; +use std::fs::File; +use std::io::{BufReader, Lines}; +use std::path::PathBuf; +use std::rc::{Rc, Weak}; + +#[derive(Debug)] +enum FsNodeType { + File, + Directory, +} + +#[derive(Debug)] +struct FsNode { + vname: String, + vsize: u64, + vtype: FsNodeType, + parent: RefCell>, + childs: RefCell>>, +} + +impl FsNode { + fn new() -> Rc { + Rc::new(FsNode { + vname: String::new(), + vsize: (0), + vtype: (FsNodeType::File), + parent: RefCell::new(Weak::new()), + childs: (RefCell::new(Vec::new())), + }) + } + + fn new_file(fname: &str, size: u64) -> Rc { + Rc::new(FsNode { + vname: (fname.to_string()), + vsize: (size), + vtype: (FsNodeType::File), + parent: RefCell::new(Weak::new()), + childs: (RefCell::new(Vec::new())), + }) + } + + fn new_dir(fname: &str) -> Rc { + Rc::new(FsNode { + vname: (fname.to_string()), + vsize: (0), + vtype: (FsNodeType::Directory), + parent: RefCell::new(Weak::new()), + childs: (RefCell::new(Vec::new())), + }) + } + + fn set_parent(&self, new_parent: &Rc) { + *self.parent.borrow_mut() = Rc::downgrade(new_parent); + } + + fn add_child_node(&self, cf: Rc) { + match self.vtype { + FsNodeType::File => {} + FsNodeType::Directory => self.childs.borrow_mut().push(cf), + } + } + + fn get_size(&self) ->u64{ + self.vsize + } + + fn get_size_of_tree(&self) -> u64{ + let mut csize:u64 = self.vsize; + for c in self.childs.borrow().iter(){ + csize += c.get_size_of_tree(); + } + csize + } + + fn get_parent(&self) -> Option> { + self.parent.borrow().upgrade() + } + + fn get_child(&self) -> Ref>> { + self.childs.borrow() + } +} fn part1(lines: Lines>) { - + let tnode1: Rc = FsNode::new_dir("test"); + let tnode2: Rc = FsNode::new_file("test", 10); + tnode2.set_parent(&tnode1); + tnode1.add_child_node(tnode2); + tnode1.add_child_node(FsNode::new_file("tesd234", 55)); + println!("{:?}", tnode1.get_size_of_tree()) } pub fn subcmd_day007(file: &Option, alt: &bool) { if let Ok(lines) = read_lines(file.as_ref().unwrap().as_path()) { - + part1(lines); } }