neo3/neo_protocol/responses/
response_transaction_attribute.rs1use crate::builder::OracleResponseCode;
2use primitive_types::H256;
3use serde::{Deserialize, Deserializer, Serialize};
4
5#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Clone)]
6#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
7pub enum TransactionAttributeType {
8 HighPriority,
9 OracleResponse,
10 NotValidBefore,
11 Conflicts,
12 }
14
15#[derive(Debug, Serialize, Deserialize, Hash, Clone, PartialEq)]
20pub struct HighPriorityAttribute {
21 }
25
26#[derive(Debug, Serialize, Deserialize, Hash, Clone, PartialEq)]
33pub struct OracleResponseAttribute {
34 #[serde(flatten)]
37 pub oracle_response: OracleResponse,
38 }
40
41#[derive(Debug, Serialize, Deserialize, Hash, Clone, PartialEq)]
49pub struct NotValidBeforeAttribute {
50 #[serde(rename = "height", deserialize_with = "deserialize_height")]
53 pub height: i64,
54 }
56
57#[derive(Debug, Serialize, Deserialize, Hash, Clone, PartialEq)]
65pub struct ConflictsAttribute {
66 #[serde(rename = "hash")]
69 pub hash: H256,
70 }
72
73#[derive(Debug, Serialize, Deserialize, Hash, Clone, PartialEq)]
81#[serde(tag = "type")] pub enum TransactionAttributeEnum {
83 #[serde(rename = "HighPriority")]
84 HighPriority(HighPriorityAttribute),
85
86 #[serde(rename = "OracleResponse")]
87 OracleResponse(OracleResponseAttribute),
88
89 #[serde(rename = "NotValidBefore")]
90 NotValidBefore(NotValidBeforeAttribute),
91
92 #[serde(rename = "Conflicts")]
93 Conflicts(ConflictsAttribute),
94 }
96
97#[derive(Serialize, Deserialize, PartialEq, Hash, Debug, Clone)]
98pub struct OracleResponse {
99 pub(crate) id: u32,
100 #[serde(rename = "code")]
101 pub(crate) response_code: OracleResponseCode,
102 pub(crate) result: String,
103}
104
105fn deserialize_height<'de, D>(deserializer: D) -> Result<i64, D::Error>
107where
108 D: Deserializer<'de>,
109{
110 let value: serde_json::Value = Deserialize::deserialize(deserializer)?;
111 match value {
112 serde_json::Value::Number(num) =>
113 num.as_i64().ok_or_else(|| serde::de::Error::custom("invalid number")),
114 serde_json::Value::String(s) => s.parse::<i64>().map_err(serde::de::Error::custom),
115 _ => Err(serde::de::Error::custom("invalid type for height")),
116 }
117}