Skip to main content

avalanche_types/jsonrpc/
admin.rs

1//! Admin API requests and responses.
2use std::io::{self, Error as ioError, ErrorKind};
3
4use serde::{Deserialize, Serialize};
5
6/// The chain alias method name
7const ALIAS_METHOD: &str = "admin.aliasChain";
8
9/// The request to alias a chain via the admin API.
10/// Ref: <https://docs.avax.network/apis/avalanchego/apis/admin#adminaliaschain>
11#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
12pub struct ChainAliasRequest {
13    /// Jsonrpc version
14    pub jsonrpc: String,
15    /// Id of request
16    pub id: u32,
17    /// Method (admin.aliasChain)
18    pub method: String,
19    /// Alias parameters
20    pub params: Option<ChainAliasParams>,
21}
22
23impl Default for ChainAliasRequest {
24    fn default() -> Self {
25        Self {
26            jsonrpc: String::from(super::DEFAULT_VERSION),
27            id: super::DEFAULT_ID,
28            method: ALIAS_METHOD.to_string(),
29            params: None,
30        }
31    }
32}
33
34impl ChainAliasRequest {
35    pub fn encode_json(&self) -> io::Result<String> {
36        serde_json::to_string(&self)
37            .map_err(|e| ioError::new(ErrorKind::Other, format!("failed to serialize JSON {}", e)))
38    }
39}
40
41/// Parameters for the alias request.
42#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
43pub struct ChainAliasParams {
44    /// The long-form chain ID
45    pub chain: String,
46    /// The newly issues alias
47    pub alias: String,
48}
49
50/// Response for the alias request.
51#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
52pub struct ChainAliasResponse {
53    /// Jsonrpc version
54    pub jsonrpc: String,
55    /// Id of request
56    pub id: u32,
57}
58
59#[cfg(test)]
60mod tests {
61    use crate::jsonrpc::admin::{ChainAliasParams, ChainAliasRequest, ChainAliasResponse};
62    use crate::jsonrpc::{DEFAULT_ID, DEFAULT_VERSION};
63
64    #[test]
65    fn test_serialization() {
66        let chain = String::from("sV6o671RtkGBcno1FiaDbVcFv2sG5aVXMZYzKdP4VQAWmJQnM");
67        let alias = String::from("devnet");
68
69        let req = ChainAliasRequest {
70            params: Some(ChainAliasParams { chain, alias }),
71            ..Default::default()
72        };
73
74        let serialized = req.encode_json().expect("failed serialization");
75
76        let expected: &str = r#"{"jsonrpc":"2.0","id":1,"method":"admin.aliasChain","params":{"chain":"sV6o671RtkGBcno1FiaDbVcFv2sG5aVXMZYzKdP4VQAWmJQnM","alias":"devnet"}}"#;
77        assert_eq!(serialized, expected);
78    }
79
80    #[test]
81    fn test_deserialization() {
82        let expected = ChainAliasResponse {
83            jsonrpc: String::from(DEFAULT_VERSION),
84            id: DEFAULT_ID,
85        };
86
87        let response = r#"{"jsonrpc": "2.0","id": 1,"result": {}}"#.as_bytes();
88        let deserialized: ChainAliasResponse =
89            serde_json::from_slice(response).expect("failed deserialization");
90
91        assert_eq!(expected, deserialized);
92    }
93}