cyfs_lib/ndn/
bdt_request.rs

1use crate::*;
2use cyfs_base::*;
3
4use serde_json::{Map, Value};
5use std::fmt;
6
7// 用以bdt层的权限控制交换信息
8pub struct BdtDataRefererInfo {
9    // refer target: maybe owner of object; or dsg contract etc.
10    pub target: Option<ObjectId>, 
11    pub object_id: ObjectId,
12    pub inner_path: Option<String>,
13
14    // source-dec-id
15    pub dec_id: Option<ObjectId>,
16
17    // target-dec-id and req-path, etc
18    pub req_path: Option<String>,
19    
20    pub referer_object: Vec<NDNDataRefererObject>,
21    pub flags: u32,
22}
23
24impl fmt::Display for BdtDataRefererInfo {
25    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26        if let Some(target) = &self.target {
27            write!(f, ", target: {}", target)?;
28        }
29        write!(f, "object_id: {:?}", self.object_id)?;
30        if let Some(inner_path) = &self.inner_path {
31            write!(f, ", inner_path: {}", inner_path)?;
32        }
33
34        if let Some(dec_id) = &self.dec_id {
35            write!(f, ", dec_id: {}", dec_id)?;
36        }
37        
38        write!(f, ", req_path: {:?}", self.req_path)?;
39        if !self.referer_object.is_empty() {
40            write!(f, ", referer_object: {:?}", self.referer_object)?;
41        }
42
43        write!(f, ", flags: {}", self.flags)?;
44
45        Ok(())
46    }
47}
48
49impl fmt::Debug for BdtDataRefererInfo {
50    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51        fmt::Display::fmt(&self, f)
52    }
53}
54
55impl JsonCodec<BdtDataRefererInfo> for BdtDataRefererInfo {
56    fn encode_json(&self) -> Map<String, Value> {
57        let mut obj = Map::new();
58        JsonCodecHelper::encode_option_string_field(&mut obj, "target", self.target.as_ref());
59        JsonCodecHelper::encode_string_field(&mut obj, "object_id", &self.object_id);
60        JsonCodecHelper::encode_option_string_field(&mut obj, "inner_path", self.inner_path.as_ref());
61
62        JsonCodecHelper::encode_option_string_field(&mut obj, "dec_id", self.dec_id.as_ref());
63        JsonCodecHelper::encode_option_string_field(&mut obj, "req_path", self.req_path.as_ref());
64
65        if self.referer_object.len() > 0 {
66            JsonCodecHelper::encode_str_array_field(
67                &mut obj,
68                "referer_object",
69                &self.referer_object,
70            );
71        }
72
73        JsonCodecHelper::encode_number_field(&mut obj, "flags", self.flags);
74
75        obj
76    }
77
78    fn decode_json(obj: &Map<String, Value>) -> BuckyResult<BdtDataRefererInfo> {
79        Ok(Self {
80            target: JsonCodecHelper::decode_option_string_field(obj,"target")?,
81            object_id: JsonCodecHelper::decode_string_field(obj,"object_id")?,
82            inner_path: JsonCodecHelper::decode_option_string_field(obj,"inner_path")?,
83            dec_id: JsonCodecHelper::decode_option_string_field(obj, "dec_id")?,
84            req_path: JsonCodecHelper::decode_option_string_field(obj, "req_path")?,
85            referer_object: JsonCodecHelper::decode_str_array_field(obj, "referer_object")?,
86            flags: JsonCodecHelper::decode_int_field(obj, "flags")?,
87        })
88    }
89}
90
91
92impl From<&NDNGetDataInputRequest> for  BdtDataRefererInfo{
93    fn from(req: &NDNGetDataInputRequest) -> Self {
94        BdtDataRefererInfo {
95            // FIXME: set target field from o link
96            target: None, 
97            object_id: req.object_id.clone(),
98            inner_path: req.inner_path.clone(),
99            dec_id: req.common.source.get_opt_dec().cloned(),
100            req_path: req.common.req_path.clone(),
101            referer_object: req.common.referer_object.clone(),
102            flags: req.common.flags,
103        }
104    }
105}