ckb-jsonrpc-types 1.1.1

Wrappers for JSON serialization
Documentation
use crate::{CellOutput, JsonBytes};
use ckb_types::{
    H256,
    core::cell::{CellMeta, CellStatus},
};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};

/// The JSON view of a cell with its status information.
///
/// ## Examples
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellWithStatus>(r#"
/// {
///   "cell": {
///     "data": {
///       "content": "0x7f454c460201010000000000000000000200f3000100000078000100000000004000000000000000980000000000000005000000400038000100400003000200010000000500000000000000000000000000010000000000000001000000000082000000000000008200000000000000001000000000000001459308d00573000000002e7368737472746162002e74657874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000010000000600000000000000780001000000000078000000000000000a0000000000000000000000000000000200000000000000000000000000000001000000030000000000000000000000000000000000000082000000000000001100000000000000000000000000000001000000000000000000000000000000",
///       "hash": "0x28e83a1277d48add8e72fadaa9248559e1b632bab2bd60b27955ebc4c03800a5"
///     },
///     "output": {
///       "capacity": "0x802665800",
///       "lock": {
///         "args": "0x",
///         "code_hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
///         "hash_type": "data"
///       },
///       "type": null
///     }
///   },
///   "status": "live"
/// }
/// # "#).unwrap();
/// ```
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellWithStatus>(r#"
/// {
///   "cell": null,
///   "status": "unknown"
/// }
/// # "#).unwrap();
/// ```
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct CellWithStatus {
    /// The cell information.
    ///
    /// For performance issues, CKB only keeps the information for live cells.
    pub cell: Option<CellInfo>,
    /// Status of the cell.
    ///
    /// Allowed values: "live", "dead", "unknown".
    ///
    /// * `live` - The transaction creating this cell is in the chain, and there are no
    ///   transactions found in the chain that uses this cell as an input.
    /// * `dead` - (**Deprecated**: the dead status will be removed since 0.36.0, please do not
    ///   rely on the logic that differentiates dead and unknown cells.) The transaction creating
    ///   this cell is in the chain, and a transaction is found in the chain which uses this cell as
    ///   an input.
    /// * `unknown` - CKB does not know the status of the cell. Either the transaction creating
    ///   this cell is not in the chain yet, or it is no longer live.
    pub status: String,
}

/// The JSON view of a cell combining the fields in cell output and cell data.
///
/// ## Examples
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellInfo>(r#"
/// {
///   "data": {
///     "content": "0x7f454c460201010000000000000000000200f3000100000078000100000000004000000000000000980000000000000005000000400038000100400003000200010000000500000000000000000000000000010000000000000001000000000082000000000000008200000000000000001000000000000001459308d00573000000002e7368737472746162002e74657874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000010000000600000000000000780001000000000078000000000000000a0000000000000000000000000000000200000000000000000000000000000001000000030000000000000000000000000000000000000082000000000000001100000000000000000000000000000001000000000000000000000000000000",
///     "hash": "0x28e83a1277d48add8e72fadaa9248559e1b632bab2bd60b27955ebc4c03800a5"
///   },
///   "output": {
///     "capacity": "0x802665800",
///     "lock": {
///       "args": "0x",
///       "code_hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
///       "hash_type": "data"
///     },
///     "type": null
///   }
/// }
/// # "#).unwrap();
/// ```
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct CellInfo {
    /// Cell fields appears in the transaction `outputs` array.
    pub output: CellOutput,
    /// Cell data.
    ///
    /// This is `null` when the data is not requested, which does not mean the cell data is empty.
    pub data: Option<CellData>,
}

/// The cell data content and hash.
///
/// ## Examples
///
/// ```
/// # serde_json::from_str::<ckb_jsonrpc_types::CellData>(r#"
/// {
///   "content": "0x7f454c460201010000000000000000000200f3000100000078000100000000004000000000000000980000000000000005000000400038000100400003000200010000000500000000000000000000000000010000000000000001000000000082000000000000008200000000000000001000000000000001459308d00573000000002e7368737472746162002e74657874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000010000000600000000000000780001000000000078000000000000000a0000000000000000000000000000000200000000000000000000000000000001000000030000000000000000000000000000000000000082000000000000001100000000000000000000000000000001000000000000000000000000000000",
///   "hash": "0x28e83a1277d48add8e72fadaa9248559e1b632bab2bd60b27955ebc4c03800a5"
/// }
/// # "#).unwrap();
/// ```
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct CellData {
    /// Cell content.
    pub content: JsonBytes,
    /// Cell content hash.
    pub hash: H256,
}

impl From<CellMeta> for CellInfo {
    fn from(cell_meta: CellMeta) -> Self {
        let data = cell_meta.mem_cell_data;
        let data_hash = cell_meta.mem_cell_data_hash;
        let output = cell_meta.cell_output.into();
        CellInfo {
            output,
            data: data.and_then(move |data| {
                data_hash.map(|hash| CellData {
                    content: JsonBytes::from_bytes(data),
                    hash: hash.into(),
                })
            }),
        }
    }
}

impl From<CellStatus> for CellWithStatus {
    fn from(status: CellStatus) -> Self {
        let (cell, status) = match status {
            CellStatus::Live(cell_meta) => (Some(cell_meta), "live"),
            CellStatus::Dead => (None, "dead"),
            CellStatus::Unknown => (None, "unknown"),
        };
        Self {
            cell: cell.map(Into::into),
            status: status.to_string(),
        }
    }
}