1use crate::directory::FatDirectory;
6use crate::file::FatFile;
7use std::ops::Deref;
8use std::sync::{Arc, Weak};
9use zx::Status;
10
11pub trait Node {
12 fn attach(&self, parent: Arc<FatDirectory>, name: &str) -> Result<(), Status>;
14
15 fn detach(&self);
17
18 fn open_ref(&self) -> Result<(), Status>;
20
21 fn close_ref(&self);
23
24 fn shut_down(&self) -> Result<(), Status>;
27
28 fn flush_dir_entry(&self) -> Result<(), Status>;
30
31 fn did_delete(&self);
33}
34
35#[derive(Clone, Debug)]
36pub enum FatNode {
39 Dir(Arc<FatDirectory>),
40 File(Arc<FatFile>),
41}
42
43impl FatNode {
44 pub fn downgrade(&self) -> WeakFatNode {
46 match self {
47 FatNode::Dir(a) => WeakFatNode::Dir(Arc::downgrade(a)),
48 FatNode::File(b) => WeakFatNode::File(Arc::downgrade(b)),
49 }
50 }
51
52 pub fn as_node(&self) -> &(dyn Node + 'static) {
53 match self {
54 FatNode::Dir(a) => a.as_ref() as &dyn Node,
55 FatNode::File(b) => b.as_ref() as &dyn Node,
56 }
57 }
58}
59
60impl<'a> Deref for FatNode {
61 type Target = dyn Node;
62
63 fn deref(&self) -> &Self::Target {
64 self.as_node()
65 }
66}
67
68#[derive(Debug)]
70pub enum WeakFatNode {
71 Dir(Weak<FatDirectory>),
72 File(Weak<FatFile>),
73}
74
75impl WeakFatNode {
76 pub fn upgrade(&self) -> Option<FatNode> {
79 match self {
80 WeakFatNode::Dir(a) => a.upgrade().map(|val| FatNode::Dir(val)),
81 WeakFatNode::File(b) => b.upgrade().map(|val| FatNode::File(val)),
82 }
83 }
84}
85
86pub struct Closer {
89 nodes: std::vec::Vec<FatNode>,
90}
91
92impl Closer {
93 pub fn new() -> Self {
94 Closer { nodes: Vec::new() }
95 }
96
97 pub fn add(&mut self, node: FatNode) -> FatNode {
98 self.nodes.push(node.clone());
99 node
100 }
101}
102
103impl Drop for Closer {
104 fn drop(&mut self) {
105 self.nodes.drain(..).for_each(|n: FatNode| n.close_ref());
106 }
107}