tiedcrossing_client/
tree.rs

1// SPDX-FileCopyrightText: 2022 Profian Inc. <opensource@profian.com>
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use super::{Entity, Result};
5
6use std::io::Read;
7use std::ops::Deref;
8
9use drawbridge_type::{Meta, TreeDirectory, TreeEntry, TreePath};
10
11use mime::Mime;
12use ureq::serde::Serialize;
13
14pub struct Node<'a>(Entity<'a>);
15
16impl<'a> Deref for Node<'a> {
17    type Target = Entity<'a>;
18
19    fn deref(&self) -> &Self::Target {
20        &self.0
21    }
22}
23
24impl<'a> Node<'a> {
25    pub fn new(entity: Entity<'a>, path: &TreePath) -> Self {
26        if path.is_empty() {
27            Self(entity)
28        } else {
29            Self(entity.child(&path.to_string()))
30        }
31    }
32
33    pub fn create_bytes(&self, mime: &Mime, data: impl AsRef<[u8]>) -> Result<bool> {
34        self.0.create_bytes(mime, data)
35    }
36
37    pub fn create_json(&self, mime: &Mime, val: &impl Serialize) -> Result<bool> {
38        self.0.create_json(mime, val)
39    }
40
41    pub fn create_from(&self, meta: &Meta, rdr: impl Read) -> Result<bool> {
42        self.0.create_from(meta, rdr)
43    }
44
45    pub fn create_directory<C>(&self, dir: &TreeDirectory<TreeEntry<C>>) -> Result<bool> {
46        let mime = TreeDirectory::<C>::TYPE
47            .parse()
48            .expect("failed to parse tree directory media type");
49        self.create_json(&mime, dir)
50    }
51}