Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions rust/catalyst-types/src/uuid/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ use minicbor::data::Tag;
pub const INVALID_UUID: uuid::Uuid = uuid::Uuid::from_bytes([0x00; 16]);

/// UUID CBOR tag <https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml/>.
#[allow(dead_code)]
const UUID_CBOR_TAG: u64 = 37;
pub const UUID_CBOR_TAG: u64 = 37;

/// Uuid validation errors, which could occur during decoding or converting to
/// `UuidV4` or `UuidV7` types.
Expand All @@ -29,6 +28,9 @@ pub enum UuidError {
/// `UUIDv7` invalid error
#[error("'{0}' is not a valid UUIDv7")]
InvalidUuidV7(uuid::Uuid),
/// Invalid string conversion
#[error("Invalid string conversion: {0}")]
StringConversion(String),
}

/// Context for `CBOR` encoding and decoding
Expand Down
16 changes: 14 additions & 2 deletions rust/catalyst-types/src/uuid/uuid_v4.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
//! `UUIDv4` Type.
use std::fmt::{Display, Formatter};
use std::{
fmt::{Display, Formatter},
str::FromStr,
};

use minicbor::{Decode, Decoder, Encode};
use uuid::Uuid;

use super::{decode_cbor_uuid, encode_cbor_uuid, CborContext, UuidError, INVALID_UUID};

/// Type representing a `UUIDv4`.
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, serde::Serialize)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, serde::Serialize)]
pub struct UuidV4(Uuid);

impl UuidV4 {
Expand Down Expand Up @@ -106,6 +109,15 @@ impl<'de> serde::Deserialize<'de> for UuidV4 {
}
}

impl FromStr for UuidV4 {
type Err = UuidError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
let uuid = Uuid::parse_str(s).map_err(|_| UuidError::StringConversion(s.to_string()))?;
UuidV4::try_from(uuid).map_err(|_| UuidError::InvalidUuidV4(uuid))
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
14 changes: 13 additions & 1 deletion rust/catalyst-types/src/uuid/uuid_v7.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
//! `UUIDv7` Type.
use std::fmt::{Display, Formatter};
use std::{
fmt::{Display, Formatter},
str::FromStr,
};

use minicbor::{Decode, Decoder, Encode};
use uuid::Uuid;
Expand Down Expand Up @@ -106,6 +109,15 @@ impl<'de> serde::Deserialize<'de> for UuidV7 {
}
}

impl FromStr for UuidV7 {
type Err = UuidError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
let uuid = Uuid::parse_str(s).map_err(|_| UuidError::StringConversion(s.to_string()))?;
UuidV7::try_from(uuid).map_err(|_| UuidError::InvalidUuidV7(uuid))
}
}

#[cfg(test)]
mod tests {
use uuid::Uuid;
Expand Down
153 changes: 103 additions & 50 deletions rust/signed_doc/src/doc_types/mod.rs
Original file line number Diff line number Diff line change
@@ -1,55 +1,108 @@
//! An implementation of different defined document types
//! <https://input-output-hk.github.io/catalyst-libs/architecture/08_concepts/signed_doc/types/>

use std::sync::LazyLock;

use catalyst_types::uuid::Uuid;
use deprecated::{
COMMENT_DOCUMENT_UUID_TYPE, PROPOSAL_ACTION_DOCUMENT_UUID_TYPE, PROPOSAL_DOCUMENT_UUID_TYPE,
};

use crate::DocType;

/// Proposal document type.
#[allow(clippy::expect_used)]
pub static PROPOSAL_DOC_TYPE: LazyLock<DocType> = LazyLock::new(|| {
let ids = &[PROPOSAL_UUID_TYPE];
ids.to_vec()
.try_into()
.expect("Failed to convert proposal document Uuid to DocType")
});

/// Proposal comment document type.
#[allow(clippy::expect_used)]
pub static PROPOSAL_COMMENT_DOC: LazyLock<DocType> = LazyLock::new(|| {
let ids = &[COMMENT_UUID_TYPE, PROPOSAL_UUID_TYPE];
ids.to_vec()
.try_into()
.expect("Failed to convert proposal comment document Uuid to DocType")
});

/// Proposal action document type.
#[allow(clippy::expect_used)]
pub static PROPOSAL_ACTION_DOC: LazyLock<DocType> = LazyLock::new(|| {
let ids = &[
ACTION_UUID_TYPE,
PROPOSAL_UUID_TYPE,
SUBMISSION_ACTION_UUID_TYPE,
];
ids.to_vec()
.try_into()
.expect("Failed to convert proposal action document Uuid to DocType")
});

/// Submission Action UUID type.
pub const SUBMISSION_ACTION_UUID_TYPE: Uuid =
Uuid::from_u128(0x7892_7329_CFD9_4EA1_9C71_0E01_9B12_6A65);
/// Proposal UUID type.
pub const PROPOSAL_UUID_TYPE: Uuid = PROPOSAL_DOCUMENT_UUID_TYPE;
/// Comment UUID type.
pub const COMMENT_UUID_TYPE: Uuid = COMMENT_DOCUMENT_UUID_TYPE;
/// Action UUID type.
pub const ACTION_UUID_TYPE: Uuid = PROPOSAL_ACTION_DOCUMENT_UUID_TYPE;

/// Document type which will be deprecated.
pub mod deprecated {
use catalyst_types::uuid::Uuid;

/// Proposal document `UuidV4` type.
pub const PROPOSAL_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x7808_D2BA_D511_40AF_84E8_C0D1_625F_DFDC);
/// Proposal template `UuidV4` type.
pub const PROPOSAL_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x0CE8_AB38_9258_4FBC_A62E_7FAA_6E58_318F);
/// Comment document `UuidV4` type.
pub const COMMENT_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0xB679_DED3_0E7C_41BA_89F8_DA62_A178_98EA);
/// Comment template `UuidV4` type.
pub const COMMENT_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x0B84_24D4_EBFD_46E3_9577_1775_A69D_290C);
/// Review document `UuidV4` type.
pub const REVIEW_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0xE4CA_F5F0_098B_45FD_94F3_0702_A457_3DB5);
/// Review template `UuidV4` type.
pub const REVIEW_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0xEBE5_D0BF_5D86_4577_AF4D_008F_DDBE_2EDC);
/// Category document `UuidV4` type.
pub const CATEGORY_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x48C2_0109_362A_4D32_9BBA_E0A9_CF8B_45BE);
/// Category template `UuidV4` type.
pub const CATEGORY_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x65B1_E8B0_51F1_46A5_9970_72CD_F268_84BE);
/// Campaign parameters document `UuidV4` type.
pub const CAMPAIGN_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x0110_EA96_A555_47CE_8408_36EF_E6ED_6F7C);
/// Campaign parameters template `UuidV4` type.
pub const CAMPAIGN_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x7E8F_5FA2_44CE_49C8_BFD5_02AF_42C1_79A3);
/// Brand parameters document `UuidV4` type.
pub const BRAND_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x3E48_08CC_C86E_467B_9702_D60B_AA9D_1FCA);
/// Brand parameters template `UuidV4` type.
pub const BRAND_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0xFD3C_1735_80B1_4EEA_8D63_5F43_6D97_EA31);
/// Proposal action document `UuidV4` type.
pub const PROPOSAL_ACTION_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x5E60_E623_AD02_4A1B_A1AC_406D_B978_EE48);
/// Public vote transaction v2 `UuidV4` type.
pub const PUBLIC_VOTE_TX_V2_UUID_TYPE: Uuid =
Uuid::from_u128(0x8DE5_586C_E998_4B95_8742_7BE3_C859_2803);
/// Private vote transaction v2 `UuidV4` type.
pub const PRIVATE_VOTE_TX_V2_UUID_TYPE: Uuid =
Uuid::from_u128(0xE78E_E18D_F380_44C1_A852_80AA_6ECB_07FE);
/// Immutable ledger block `UuidV4` type.
pub const IMMUTABLE_LEDGER_BLOCK_UUID_TYPE: Uuid =
Uuid::from_u128(0xD9E7_E6CE_2401_4D7D_9492_F4F7_C642_41C3);
/// Submission Action `UuidV4` type.
pub const SUBMISSION_ACTION: Uuid = Uuid::from_u128(0x7892_7329_CFD9_4EA1_9C71_0E01_9B12_6A65);
/// Proposal document `UuidV4` type.
pub const PROPOSAL_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x7808_D2BA_D511_40AF_84E8_C0D1_625F_DFDC);
/// Proposal template `UuidV4` type.
pub const PROPOSAL_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x0CE8_AB38_9258_4FBC_A62E_7FAA_6E58_318F);
/// Comment document `UuidV4` type.
pub const COMMENT_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0xB679_DED3_0E7C_41BA_89F8_DA62_A178_98EA);
/// Comment template `UuidV4` type.
pub const COMMENT_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x0B84_24D4_EBFD_46E3_9577_1775_A69D_290C);
/// Review document `UuidV4` type.
pub const REVIEW_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0xE4CA_F5F0_098B_45FD_94F3_0702_A457_3DB5);
/// Review template `UuidV4` type.
pub const REVIEW_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0xEBE5_D0BF_5D86_4577_AF4D_008F_DDBE_2EDC);
/// Category document `UuidV4` type.
pub const CATEGORY_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x48C2_0109_362A_4D32_9BBA_E0A9_CF8B_45BE);
/// Category template `UuidV4` type.
pub const CATEGORY_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x65B1_E8B0_51F1_46A5_9970_72CD_F268_84BE);
/// Campaign parameters document `UuidV4` type.
pub const CAMPAIGN_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x0110_EA96_A555_47CE_8408_36EF_E6ED_6F7C);
/// Campaign parameters template `UuidV4` type.
pub const CAMPAIGN_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0x7E8F_5FA2_44CE_49C8_BFD5_02AF_42C1_79A3);
/// Brand parameters document `UuidV4` type.
pub const BRAND_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x3E48_08CC_C86E_467B_9702_D60B_AA9D_1FCA);
/// Brand parameters template `UuidV4` type.
pub const BRAND_TEMPLATE_UUID_TYPE: Uuid =
Uuid::from_u128(0xFD3C_1735_80B1_4EEA_8D63_5F43_6D97_EA31);
/// Proposal action document `UuidV4` type.
pub const PROPOSAL_ACTION_DOCUMENT_UUID_TYPE: Uuid =
Uuid::from_u128(0x5E60_E623_AD02_4A1B_A1AC_406D_B978_EE48);
/// Public vote transaction v2 `UuidV4` type.
pub const PUBLIC_VOTE_TX_V2_UUID_TYPE: Uuid =
Uuid::from_u128(0x8DE5_586C_E998_4B95_8742_7BE3_C859_2803);
/// Private vote transaction v2 `UuidV4` type.
pub const PRIVATE_VOTE_TX_V2_UUID_TYPE: Uuid =
Uuid::from_u128(0xE78E_E18D_F380_44C1_A852_80AA_6ECB_07FE);
/// Immutable ledger block `UuidV4` type.
pub const IMMUTABLE_LEDGER_BLOCK_UUID_TYPE: Uuid =
Uuid::from_u128(0xD9E7_E6CE_2401_4D7D_9492_F4F7_C642_41C3);
/// Submission Action `UuidV4` type.
pub const SUBMISSION_ACTION: Uuid = Uuid::from_u128(0x7892_7329_CFD9_4EA1_9C71_0E01_9B12_6A65);
}
13 changes: 9 additions & 4 deletions rust/signed_doc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ pub use catalyst_types::{
};
pub use content::Content;
use coset::{CborSerializable, Header, TaggedCborSerializable};
use decode_context::{CompatibilityPolicy, DecodeContext};
pub use metadata::{
ContentEncoding, ContentType, DocType, DocumentRef, ExtraFields, Metadata, Section,
};
Expand Down Expand Up @@ -88,11 +89,11 @@ impl From<InnerCatalystSignedDocument> for CatalystSignedDocument {
impl CatalystSignedDocument {
// A bunch of getters to access the contents, or reason through the document, such as.

/// Return Document Type `UUIDv4`.
/// Return Document Type `DocType` - List of `UUIDv4`.
///
/// # Errors
/// - Missing 'type' field.
pub fn doc_type(&self) -> anyhow::Result<UuidV4> {
pub fn doc_type(&self) -> anyhow::Result<&DocType> {
self.inner.metadata.doc_type()
}

Expand Down Expand Up @@ -238,8 +239,12 @@ impl Decode<'_, ()> for CatalystSignedDocument {
minicbor::decode::Error::message(format!("Invalid COSE Sign document: {e}"))
})?;

let report = ProblemReport::new(PROBLEM_REPORT_CTX);
let metadata = Metadata::from_protected_header(&cose_sign.protected, &report);
let mut report = ProblemReport::new(PROBLEM_REPORT_CTX);
let mut ctx = DecodeContext {
compatibility_policy: CompatibilityPolicy::Accept,
report: &mut report,
};
let metadata = Metadata::from_protected_header(&cose_sign.protected, &mut ctx);
let signatures = Signatures::from_cose_sig_list(&cose_sign.signatures, &report);

let content = if let Some(payload) = cose_sign.payload {
Expand Down
Loading
Loading