1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use crate::commands::{from_op, TuringOp};
use anyhow::Result;
use serde::Serialize;

/// ### Handles all queries releated to fields
/// ```rust
/// #[derive(Debug, Serialize, Clone)]
/// pub struct DocumentQuery {
///     db: String,
///     document: Option<String>,
/// }
/// ```
#[derive(Debug, Serialize, Clone, Default)]
pub struct DocumentQuery {
    db: String,
    document: Option<String>,
}

impl DocumentQuery {
    /// ### Initialize a new empty document
    /// #### Usage
    /// ```rust
    /// use crate::DocumentQuery;
    ///
    /// Document::new()
    /// ```
    pub fn new() -> Self {
        Self {
            db: Default::default(),
            document: Default::default(),
        }
    }
    /// ### Add a database name
    /// #### Usage
    /// ```rust
    /// use crate::DocumentQuery;
    ///
    /// let mut foo = DocumentQuery::new();
    /// foo.db("db_name");
    /// ```
    pub fn db(&mut self, name: &str) -> &Self {
        self.db = name.into();

        self
    }
    /// ### Add a document name
    /// #### Usage
    /// ```rust
    /// use crate::DocumentQuery;
    ///
    /// let mut foo = DocumentQuery::new();
    /// foo
    ///   .db("db_name")
    ///   .document("document_name");
    /// ```
    pub fn document(&mut self, name: &str) -> &Self {
        self.document = Some(name.into());

        self
    }
    /// ### Creates a new document in a database
    /// #### Usage
    /// ```rust
    /// use crate::DocumentQuery;
    ///
    /// let mut foo = DocumentQuery::new();
    /// foo
    ///   .db("db_name")
    ///   .document("document_name")
    ///   .create()
    /// ```
    pub fn create(&self) -> Result<Vec<u8>> {
        let mut packet = from_op(&TuringOp::DocumentCreate).to_vec();
        packet.extend_from_slice(self.db.as_bytes());

        let data = bincode::serialize::<Self>(self)?;
        packet.extend_from_slice(&data);

        Ok(packet)
    }
    /// ### List all documents in a database
    /// #### Usage
    /// ```rust
    /// use crate::DocumentQuery;
    ///
    /// let mut foo = DocumentQuery::new();
    /// foo
    ///   .db("db_name")
    ///   .list()
    /// ```
    pub fn list(&self) -> Result<Vec<u8>> {
        let mut packet = from_op(&TuringOp::DocumentList).to_vec();
        packet.extend_from_slice(self.db.as_bytes());

        let data = bincode::serialize::<Self>(self)?;
        packet.extend_from_slice(&data);

        Ok(packet)
    }
    /// ### Drops document in a database
    /// #### Usage
    /// ```rust
    /// use crate::DocumentQuery;
    ///
    /// let mut foo = DocumentQuery::new();
    /// foo
    ///   .db("db_name")
    ///   .document("document_name")
    ///   .drop()
    /// ```
    pub fn drop(&self) -> Result<Vec<u8>> {
        let mut packet = from_op(&TuringOp::DocumentDrop).to_vec();
        packet.extend_from_slice(self.db.as_bytes());

        let data = bincode::serialize::<Self>(self)?;
        packet.extend_from_slice(&data);

        Ok(packet)
    }
}