mod errors;
pub use errors::*;
use crate::spec::prelude::*;
pub type ConsentResult = Result<ConsentInfo, Icrc21Error>;
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ConsentInfo {
pub consent_message: ConsentMessage,
pub metadata: ConsentMessageMetadata,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub enum ConsentMessage {
GenericDisplayMessage(String),
FieldsDisplayMessage(FieldsDisplay),
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ConsentMessageMetadata {
pub language: String,
pub utc_offset_minutes: Option<i16>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ConsentMessageRequest {
pub method: String,
pub arg: Vec<u8>,
pub user_preferences: ConsentMessageSpec,
}
#[derive(CandidType, Deserialize)]
pub enum ConsentMessageResponse {
Ok(ConsentInfo),
Err(Icrc21Error),
}
impl From<ConsentResult> for ConsentMessageResponse {
fn from(res: ConsentResult) -> Self {
match res {
Ok(info) => Self::Ok(info),
Err(err) => Self::Err(err),
}
}
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ConsentMessageSpec {
pub metadata: ConsentMessageMetadata,
pub device_spec: Option<DisplayMessageType>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub enum DisplayMessageType {
GenericDisplay,
FieldsDisplay,
}
#[derive(CandidType, Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct FieldsDisplay {
pub intent: String,
pub fields: Vec<(String, Value)>,
}
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub enum Value {
TokenAmount {
decimals: u8,
amount: u64,
symbol: String,
},
TimestampSeconds {
amount: u64,
},
DurationSeconds {
amount: u64,
},
Text {
content: String,
},
}