Skip to main content

chio_open_market/
evidence.rs

1use serde::{Deserialize, Serialize};
2
3use crate::validation::{is_sha256_hex, validate_non_empty};
4
5#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
6#[serde(rename_all = "snake_case")]
7pub enum OpenMarketEvidenceKind {
8    GovernanceCase,
9    TrustActivation,
10    Listing,
11    PortableNegativeEvent,
12    External,
13}
14
15#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
16#[serde(rename_all = "snake_case")]
17pub enum OpenMarketFindingCode {
18    ListingUnverifiable,
19    FeeScheduleUnverifiable,
20    FeeScheduleExpired,
21    FeeScheduleScopeMismatch,
22    ActivationUnverifiable,
23    ActivationMissing,
24    ActivationMismatch,
25    GovernanceCaseAuthorityInvalid,
26    GovernanceCaseExpired,
27    GovernanceCaseKindInvalid,
28    PenaltyUnverifiable,
29    PenaltyExpired,
30    BondRequirementMissing,
31    BondRequirementNotSlashable,
32    PenaltyCurrencyMismatch,
33    PenaltyAmountExceedsBond,
34    PriorPenaltyMissing,
35    PriorPenaltyInvalid,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
39#[serde(rename_all = "camelCase")]
40pub struct OpenMarketEvidenceReference {
41    pub kind: OpenMarketEvidenceKind,
42    pub reference_id: String,
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub uri: Option<String>,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub sha256: Option<String>,
47}
48
49impl OpenMarketEvidenceReference {
50    pub fn validate(&self, field: &str) -> Result<(), String> {
51        validate_non_empty(&self.reference_id, &format!("{field}.reference_id"))?;
52        if let Some(uri) = self.uri.as_deref() {
53            validate_non_empty(uri, &format!("{field}.uri"))?;
54        }
55        if let Some(sha256) = self.sha256.as_deref() {
56            let sha256_field = format!("{field}.sha256");
57            if !is_sha256_hex(sha256) {
58                return Err(format!(
59                    "{sha256_field} must be a 64-character SHA-256 hex digest"
60                ));
61            }
62        }
63        Ok(())
64    }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
68#[serde(rename_all = "camelCase")]
69pub struct OpenMarketFinding {
70    pub code: OpenMarketFindingCode,
71    pub message: String,
72}