chio_open_market/
evidence.rs1use 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}