From d75d554f4b430486892d1ec741bf4e686b956c52 Mon Sep 17 00:00:00 2001 From: Miroslav Kovar Date: Tue, 27 Jun 2023 14:07:11 +0200 Subject: [PATCH] WIP Signed-off-by: Miroslav Kovar --- .github/workflows/main.yml | 3 - did_peer/src/error.rs | 4 +- .../src/numalgos/numalgo2/generate/mod.rs | 9 +- did_peer/src/numalgos/numalgo3/generate.rs | 15 ++- did_peer/src/peer_did/mod.rs | 9 +- did_peer/src/peer_did/numalgo.rs | 36 ------ did_peer/src/peer_did/numalgos/mod.rs | 43 +++++++ did_peer/src/peer_did/numalgos/numalgo0.rs | 12 ++ did_peer/src/peer_did/numalgos/numalgo1.rs | 12 ++ did_peer/src/peer_did/numalgos/numalgo2.rs | 36 ++++++ did_peer/src/peer_did/numalgos/numalgo3.rs | 26 ++++ did_peer/src/peer_did/peer_did/generic.rs | 63 ++++++++++ .../peer_did/{peer_did.rs => peer_did/mod.rs} | 112 +++++++----------- did_peer/src/peer_did/peer_did/parsing.rs | 29 +++++ did_peer/src/peer_did/{ => peer_did}/regex.rs | 0 .../src/peer_did/{ => peer_did}/transform.rs | 0 did_peer/src/peer_did/traits.rs | 48 ++++++++ did_peer/src/peer_did_resolver/resolver.rs | 14 +-- did_peer/tests/generate.rs | 10 +- 19 files changed, 346 insertions(+), 135 deletions(-) delete mode 100644 did_peer/src/peer_did/numalgo.rs create mode 100644 did_peer/src/peer_did/numalgos/mod.rs create mode 100644 did_peer/src/peer_did/numalgos/numalgo0.rs create mode 100644 did_peer/src/peer_did/numalgos/numalgo1.rs create mode 100644 did_peer/src/peer_did/numalgos/numalgo2.rs create mode 100644 did_peer/src/peer_did/numalgos/numalgo3.rs create mode 100644 did_peer/src/peer_did/peer_did/generic.rs rename did_peer/src/peer_did/{peer_did.rs => peer_did/mod.rs} (58%) create mode 100644 did_peer/src/peer_did/peer_did/parsing.rs rename did_peer/src/peer_did/{ => peer_did}/regex.rs (100%) rename did_peer/src/peer_did/{ => peer_did}/transform.rs (100%) create mode 100644 did_peer/src/peer_did/traits.rs diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d226182a83..ff8a132c84 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,9 +4,6 @@ on: push: branches: - main - pull_request: - branches: - - "**" env: DOCKER_BUILDKIT: 1 diff --git a/did_peer/src/error.rs b/did_peer/src/error.rs index fe14a85a47..d9a242c642 100644 --- a/did_peer/src/error.rs +++ b/did_peer/src/error.rs @@ -3,7 +3,7 @@ use std::convert::Infallible; use did_doc::schema::verification_method::VerificationMethodType; use thiserror::Error; -use crate::peer_did::Numalgo; +use crate::peer_did::NumalgoKind; #[derive(Debug, Error)] pub enum DidPeerError { @@ -20,7 +20,7 @@ pub enum DidPeerError { #[error("Sovrin DID document builder error: {0}")] DidDocumentSovBuilderError(#[from] did_doc_sov::error::DidDocumentSovError), #[error("Unsupported numalgo: {0}")] - UnsupportedNumalgo(Numalgo), + UnsupportedNumalgo(NumalgoKind), #[error("Invalid numalgo character: {0}")] InvalidNumalgoCharacter(char), #[error("Unsupported purpose character: {0}")] diff --git a/did_peer/src/numalgos/numalgo2/generate/mod.rs b/did_peer/src/numalgos/numalgo2/generate/mod.rs index ab7e34b576..cf267f244d 100644 --- a/did_peer/src/numalgos/numalgo2/generate/mod.rs +++ b/did_peer/src/numalgos/numalgo2/generate/mod.rs @@ -3,15 +3,18 @@ mod helpers; use did_doc::schema::did_doc::DidDocument; use did_doc_sov::extra_fields::ExtraFieldsSov; -use crate::{error::DidPeerError, peer_did::PeerDid}; +use crate::{ + error::DidPeerError, + peer_did::{numalgo2::Numalgo2, PeerDid}, +}; use self::helpers::{append_encoded_key_segments, append_encoded_service_segment}; -pub fn generate_numalgo2(did_document: DidDocument) -> Result { +pub fn generate_numalgo2(did_document: DidDocument) -> Result, DidPeerError> { let mut did = String::from("did:peer:2"); did = append_encoded_key_segments(did, &did_document)?; did = append_encoded_service_segment(did, &did_document)?; - PeerDid::parse(did) + PeerDid::::from_did(did) } diff --git a/did_peer/src/numalgos/numalgo3/generate.rs b/did_peer/src/numalgos/numalgo3/generate.rs index 03c4fd330d..981c443f0e 100644 --- a/did_peer/src/numalgos/numalgo3/generate.rs +++ b/did_peer/src/numalgos/numalgo3/generate.rs @@ -1,12 +1,15 @@ use did_parser::Did; use sha256::digest; -use crate::{error::DidPeerError, peer_did::PeerDid}; +use crate::{ + error::DidPeerError, + peer_did::{numalgo3::Numalgo3, PeerDid}, +}; -pub fn generate_numalgo3(did: &Did) -> Result { +pub fn generate_numalgo3(did: &Did) -> Result, DidPeerError> { let numalgoless_id = did.id().chars().skip(2).collect::(); let numalgoless_id_hashed = digest(numalgoless_id); - PeerDid::parse(format!("did:peer:3.{}", numalgoless_id_hashed)) + PeerDid::::from_did(format!("did:peer:3.{}", numalgoless_id_hashed)) } #[cfg(test)] @@ -21,8 +24,10 @@ mod tests { .Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg\ .SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0".to_string()).unwrap(); assert_eq!( - PeerDid::parse("did:peer:3.0e857e93798921e83cfc2ef8bee9cafc25f15f4c9c7bee5ed9a9c62b56a62cca".to_string()) - .unwrap(), + PeerDid::::from_did( + "did:peer:3.0e857e93798921e83cfc2ef8bee9cafc25f15f4c9c7bee5ed9a9c62b56a62cca".to_string() + ) + .unwrap(), generate_numalgo3(&peer_did_2).unwrap() ); } diff --git a/did_peer/src/peer_did/mod.rs b/did_peer/src/peer_did/mod.rs index 15debd2917..d829435e5c 100644 --- a/did_peer/src/peer_did/mod.rs +++ b/did_peer/src/peer_did/mod.rs @@ -1,7 +1,6 @@ -mod numalgo; +mod numalgos; mod peer_did; -mod regex; -mod transform; +pub(super) mod traits; -pub use numalgo::Numalgo; -pub use peer_did::PeerDid; +pub use numalgos::{numalgo0, numalgo1, numalgo2, numalgo3, NumalgoKind}; +pub use peer_did::{GenericPeerDid, PeerDid}; diff --git a/did_peer/src/peer_did/numalgo.rs b/did_peer/src/peer_did/numalgo.rs deleted file mode 100644 index f02fe5c55a..0000000000 --- a/did_peer/src/peer_did/numalgo.rs +++ /dev/null @@ -1,36 +0,0 @@ -use std::fmt::Display; - -use crate::error::DidPeerError; - -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum Numalgo { - InceptionKeyWithoutDoc, - GenesisDoc, - MultipleInceptionKeys, - DidShortening, -} - -impl Display for Numalgo { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Numalgo::InceptionKeyWithoutDoc => write!(f, "0"), - Numalgo::GenesisDoc => write!(f, "1"), - Numalgo::MultipleInceptionKeys => write!(f, "2"), - Numalgo::DidShortening => write!(f, "3"), - } - } -} - -impl TryFrom for Numalgo { - type Error = DidPeerError; - - fn try_from(value: char) -> Result { - match value { - '0' => Ok(Numalgo::InceptionKeyWithoutDoc), - '1' => Ok(Numalgo::GenesisDoc), - '2' => Ok(Numalgo::MultipleInceptionKeys), - '3' => Ok(Numalgo::DidShortening), - c @ _ => Err(DidPeerError::InvalidNumalgoCharacter(c)), - } - } -} diff --git a/did_peer/src/peer_did/numalgos/mod.rs b/did_peer/src/peer_did/numalgos/mod.rs new file mode 100644 index 0000000000..ff829c4ac0 --- /dev/null +++ b/did_peer/src/peer_did/numalgos/mod.rs @@ -0,0 +1,43 @@ +pub mod numalgo0; +pub mod numalgo1; +pub mod numalgo2; +pub mod numalgo3; + +use std::fmt::Display; + +use crate::error::DidPeerError; + +use super::{numalgo0::Numalgo0, numalgo1::Numalgo1, numalgo2::Numalgo2, numalgo3::Numalgo3, traits::Numalgo}; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum NumalgoKind { + InceptionKeyWithoutDoc(Numalgo0), + GenesisDoc(Numalgo1), + MultipleInceptionKeys(Numalgo2), + DidShortening(Numalgo3), +} + +impl Display for NumalgoKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + NumalgoKind::InceptionKeyWithoutDoc(_) => Numalgo0::NUMALGO_CHAR.fmt(f), + NumalgoKind::GenesisDoc(_) => Numalgo1::NUMALGO_CHAR.fmt(f), + NumalgoKind::MultipleInceptionKeys(_) => Numalgo2::NUMALGO_CHAR.fmt(f), + NumalgoKind::DidShortening(_) => Numalgo3::NUMALGO_CHAR.fmt(f), + } + } +} + +impl TryFrom for NumalgoKind { + type Error = DidPeerError; + + fn try_from(value: char) -> Result { + match value { + Numalgo0::NUMALGO_CHAR => Ok(NumalgoKind::InceptionKeyWithoutDoc(Numalgo0)), + Numalgo1::NUMALGO_CHAR => Ok(NumalgoKind::GenesisDoc(Numalgo1)), + Numalgo2::NUMALGO_CHAR => Ok(NumalgoKind::MultipleInceptionKeys(Numalgo2)), + Numalgo3::NUMALGO_CHAR => Ok(NumalgoKind::DidShortening(Numalgo3)), + c @ _ => Err(DidPeerError::InvalidNumalgoCharacter(c)), + } + } +} diff --git a/did_peer/src/peer_did/numalgos/numalgo0.rs b/did_peer/src/peer_did/numalgos/numalgo0.rs new file mode 100644 index 0000000000..e822327f4b --- /dev/null +++ b/did_peer/src/peer_did/numalgos/numalgo0.rs @@ -0,0 +1,12 @@ +use crate::peer_did::traits::Numalgo; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Numalgo0; + +impl Numalgo for Numalgo0 { + const NUMALGO_CHAR: char = '0'; + + fn default() -> Self { + Self + } +} diff --git a/did_peer/src/peer_did/numalgos/numalgo1.rs b/did_peer/src/peer_did/numalgos/numalgo1.rs new file mode 100644 index 0000000000..e3338b1076 --- /dev/null +++ b/did_peer/src/peer_did/numalgos/numalgo1.rs @@ -0,0 +1,12 @@ +use crate::peer_did::traits::Numalgo; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Numalgo1; + +impl Numalgo for Numalgo1 { + const NUMALGO_CHAR: char = '1'; + + fn default() -> Self { + Self + } +} diff --git a/did_peer/src/peer_did/numalgos/numalgo2.rs b/did_peer/src/peer_did/numalgos/numalgo2.rs new file mode 100644 index 0000000000..57e39be610 --- /dev/null +++ b/did_peer/src/peer_did/numalgos/numalgo2.rs @@ -0,0 +1,36 @@ +use did_doc::schema::did_doc::DidDocument; +use did_doc_sov::extra_fields::ExtraFieldsSov; +use did_parser::Did; + +use crate::{ + error::DidPeerError, + peer_did::{ + traits::{Numalgo, ResolvablePeerDid, ToNumalgo3}, + PeerDid, + }, +}; + +use super::numalgo3::Numalgo3; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Numalgo2; + +impl Numalgo for Numalgo2 { + const NUMALGO_CHAR: char = '2'; + + fn default() -> Self { + Self + } +} + +impl ResolvablePeerDid for Numalgo2 { + fn resolve(&self) -> Result, DidPeerError> { + todo!() + } +} + +impl ToNumalgo3 for Numalgo2 { + fn to_numalgo3(&self, did: &Did) -> Result, DidPeerError> { + todo!() + } +} diff --git a/did_peer/src/peer_did/numalgos/numalgo3.rs b/did_peer/src/peer_did/numalgos/numalgo3.rs new file mode 100644 index 0000000000..dc572898c9 --- /dev/null +++ b/did_peer/src/peer_did/numalgos/numalgo3.rs @@ -0,0 +1,26 @@ +use did_parser::Did; + +use crate::{ + error::DidPeerError, + peer_did::{ + traits::{Numalgo, ToNumalgo3}, + PeerDid, + }, +}; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Numalgo3; + +impl Numalgo for Numalgo3 { + const NUMALGO_CHAR: char = '3'; + + fn default() -> Self { + Self + } +} + +impl ToNumalgo3 for Numalgo3 { + fn to_numalgo3(&self, did: &Did) -> Result, DidPeerError> { + todo!() + } +} diff --git a/did_peer/src/peer_did/peer_did/generic.rs b/did_peer/src/peer_did/peer_did/generic.rs new file mode 100644 index 0000000000..9f00089483 --- /dev/null +++ b/did_peer/src/peer_did/peer_did/generic.rs @@ -0,0 +1,63 @@ +use crate::{ + error::DidPeerError, + peer_did::{numalgo2::Numalgo2, numalgo3::Numalgo3, NumalgoKind}, +}; +use did_parser::Did; +use serde::{Deserialize, Deserializer}; + +use super::{ + parsing::{parse_numalgo, parse_transform, validate}, + PeerDid, +}; + +#[derive(Clone, Debug, PartialEq)] +pub enum GenericPeerDid { + Numalgo2(PeerDid), + Numalgo3(PeerDid), +} + +impl GenericPeerDid { + pub fn parse(did: T) -> Result + where + Did: TryFrom, + >::Error: Into, + { + let did: Did = did.try_into().map_err(Into::into)?; + let numalgo = parse_numalgo(&did)?; + let transform = match numalgo { + NumalgoKind::InceptionKeyWithoutDoc(_) | NumalgoKind::GenesisDoc(_) => Some(parse_transform(&did)?), + _ => None, + }; + validate(&did)?; + let parsed = match numalgo { + NumalgoKind::MultipleInceptionKeys(numalgo) => GenericPeerDid::Numalgo2(PeerDid { + did, + numalgo, + transform, + }), + _ => GenericPeerDid::Numalgo3(PeerDid { + did, + numalgo: Numalgo3, + transform, + }), + }; + Ok(parsed) + } + + pub fn numalgo(&self) -> NumalgoKind { + match self { + GenericPeerDid::Numalgo2(peer_did) => NumalgoKind::MultipleInceptionKeys(peer_did.numalgo), + GenericPeerDid::Numalgo3(peer_did) => NumalgoKind::DidShortening(peer_did.numalgo), + } + } +} + +impl<'de> Deserialize<'de> for GenericPeerDid { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let did = String::deserialize(deserializer)?; + Self::parse(did).map_err(serde::de::Error::custom) + } +} diff --git a/did_peer/src/peer_did/peer_did.rs b/did_peer/src/peer_did/peer_did/mod.rs similarity index 58% rename from did_peer/src/peer_did/peer_did.rs rename to did_peer/src/peer_did/peer_did/mod.rs index 33e7525168..73528c8c70 100644 --- a/did_peer/src/peer_did/peer_did.rs +++ b/did_peer/src/peer_did/peer_did/mod.rs @@ -1,92 +1,79 @@ +mod generic; +mod parsing; +mod regex; +mod transform; + +pub use generic::GenericPeerDid; +pub(super) use parsing::validate; + use std::fmt::Display; use crate::{error::DidPeerError, numalgos::numalgo2::generate_numalgo2, numalgos::numalgo3::generate_numalgo3}; use did_doc::schema::did_doc::DidDocument; use did_doc_sov::extra_fields::ExtraFieldsSov; use did_parser::Did; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde::{Serialize, Serializer}; -use super::{numalgo::Numalgo, regex::PEER_DID_REGEX, transform::Transform}; +use self::transform::Transform; + +use super::{ + numalgos::{numalgo2::Numalgo2, numalgo3::Numalgo3}, + traits::{Numalgo, ToNumalgo3}, + NumalgoKind, +}; #[derive(Clone, Debug, PartialEq)] -pub struct PeerDid { +pub struct PeerDid { did: Did, - numalgo: Numalgo, + numalgo: N, transform: Option, } -impl PeerDid { - pub fn parse(did: T) -> Result - where - Did: TryFrom, - >::Error: Into, - { - let did: Did = did.try_into().map_err(Into::into)?; - let numalgo = Self::parse_numalgo(&did)?; - let transform = match numalgo { - Numalgo::InceptionKeyWithoutDoc | Numalgo::GenesisDoc => Some(Self::parse_transform(&did)?), - _ => None, - }; - Self::validate(&did)?; - Ok(Self { - did, - numalgo, - transform, - }) - } +impl PeerDid { pub fn did(&self) -> &Did { &self.did } - pub fn numalgo(&self) -> &Numalgo { - &self.numalgo - } - pub fn transform(&self) -> Option<&Transform> { self.transform.as_ref() } - pub fn generate_numalgo2(did_document: DidDocument) -> Result { + // TODO: Move elsewhere + pub fn generate_numalgo2(did_document: DidDocument) -> Result, DidPeerError> { generate_numalgo2(did_document) } - pub fn generate_numalgo3(did_document: DidDocument) -> Result { + // TODO: Move elsewhere + pub fn generate_numalgo3(did_document: DidDocument) -> Result, DidPeerError> { generate_numalgo3(Self::generate_numalgo2(did_document)?.did()) } - pub fn to_numalgo3(&self) -> Result { - match self.numalgo() { - Numalgo::MultipleInceptionKeys => generate_numalgo3(self.did()), - n @ _ => Err(DidPeerError::UnsupportedNumalgo(n.clone())), - } - } - - fn validate(did: &Did) -> Result<(), DidPeerError> { - if !PEER_DID_REGEX.is_match(did.did()) { - Err(DidPeerError::DidValidationError(format!("Invalid did: {}", did.did()))) - } else { - Ok(()) + pub(crate) fn from_parts(did: Did, numalgo: N, transform: Option) -> PeerDid { + Self { + did, + numalgo, + transform, } } +} - fn parse_numalgo(did: &Did) -> Result { - did.id() - .chars() - .nth(0) - .ok_or_else(|| DidPeerError::DidValidationError(format!("Invalid did: {}", did.did())))? - .try_into() +impl PeerDid { + pub fn from_did(did: T) -> Result, DidPeerError> + where + Did: TryFrom, + >::Error: Into, + { + N::from_did(did) } +} - fn parse_transform(did: &Did) -> Result { - did.id() - .chars() - .nth(1) - .ok_or_else(|| DidPeerError::DidValidationError(format!("Invalid did: {}", did.did())))? - .try_into() +impl PeerDid { + pub fn to_numalgo3(&self) -> Result, DidPeerError> { + self.numalgo.to_numalgo3(self.did()) } } -impl Serialize for PeerDid { +impl Serialize for PeerDid { fn serialize(&self, serializer: S) -> Result where S: Serializer, @@ -95,17 +82,7 @@ impl Serialize for PeerDid { } } -impl<'de> Deserialize<'de> for PeerDid { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let did = String::deserialize(deserializer)?; - Self::parse(did).map_err(serde::de::Error::custom) - } -} - -impl Display for PeerDid { +impl Display for PeerDid { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.did) } @@ -117,12 +94,13 @@ mod tests { mod parse { use super::*; + use crate::peer_did::numalgo2::Numalgo2; macro_rules! generate_negative_parse_test { ($test_name:ident, $input:expr, $error_pattern:pat) => { #[test] fn $test_name() { - let result = PeerDid::parse($input.to_string()); + let result = PeerDid::::from_did($input.to_string()); assert!(matches!(result, Err($error_pattern))); } }; @@ -158,7 +136,7 @@ mod tests { #[test] fn test_peer_did_numalgo2() { let did = "did:peer:3.8a33de52d9e9e9cfd5c5fd8a7e5da5d3c73208bfc5e5fd5a4eb4af3f3b3f3a3a"; - assert!(PeerDid::parse(did.to_string()).is_ok()); + assert!(PeerDid::::from_did(did.to_string()).is_ok()); } } } diff --git a/did_peer/src/peer_did/peer_did/parsing.rs b/did_peer/src/peer_did/peer_did/parsing.rs new file mode 100644 index 0000000000..39cbd1c03e --- /dev/null +++ b/did_peer/src/peer_did/peer_did/parsing.rs @@ -0,0 +1,29 @@ +use did_parser::Did; + +use crate::error::DidPeerError; + +use super::{regex::PEER_DID_REGEX, transform::Transform, NumalgoKind}; + +pub fn parse_numalgo(did: &Did) -> Result { + did.id() + .chars() + .nth(0) + .ok_or_else(|| DidPeerError::DidValidationError(format!("Invalid did: {}", did.did())))? + .try_into() +} + +pub fn parse_transform(did: &Did) -> Result { + did.id() + .chars() + .nth(1) + .ok_or_else(|| DidPeerError::DidValidationError(format!("Invalid did: {}", did.did())))? + .try_into() +} + +pub fn validate(did: &Did) -> Result<(), DidPeerError> { + if !PEER_DID_REGEX.is_match(did.did()) { + Err(DidPeerError::DidValidationError(format!("Invalid did: {}", did.did()))) + } else { + Ok(()) + } +} diff --git a/did_peer/src/peer_did/regex.rs b/did_peer/src/peer_did/peer_did/regex.rs similarity index 100% rename from did_peer/src/peer_did/regex.rs rename to did_peer/src/peer_did/peer_did/regex.rs diff --git a/did_peer/src/peer_did/transform.rs b/did_peer/src/peer_did/peer_did/transform.rs similarity index 100% rename from did_peer/src/peer_did/transform.rs rename to did_peer/src/peer_did/peer_did/transform.rs diff --git a/did_peer/src/peer_did/traits.rs b/did_peer/src/peer_did/traits.rs new file mode 100644 index 0000000000..43746043f2 --- /dev/null +++ b/did_peer/src/peer_did/traits.rs @@ -0,0 +1,48 @@ +use did_doc::schema::did_doc::DidDocument; +use did_doc_sov::extra_fields::ExtraFieldsSov; +use did_parser::Did; + +use crate::{ + error::DidPeerError, + peer_did::{numalgo3::Numalgo3, PeerDid}, +}; + +use super::peer_did::validate; + +pub trait ResolvablePeerDid { + fn resolve(&self) -> Result, DidPeerError>; +} + +pub trait ToNumalgo3 { + fn to_numalgo3(&self, did: &Did) -> Result, DidPeerError>; +} + +pub trait Numalgo: Sized { + const NUMALGO_CHAR: char; + + fn default() -> Self; + + fn from_did(did: T) -> Result, DidPeerError> + where + Did: TryFrom, + >::Error: Into, + { + let did: Did = did.try_into().map_err(Into::into)?; + + let numalgo_char = did.id().chars().nth(0).ok_or_else(|| { + DidPeerError::DidValidationError(format!( + "Invalid did: unable to read numalgo character in did {}", + did.did() + )) + })?; + + if numalgo_char != Self::NUMALGO_CHAR { + return Err(DidPeerError::InvalidNumalgoCharacter(numalgo_char)); + } + + validate(&did)?; + + // TODO: Parse transform based on numalgo + Ok(PeerDid::from_parts(did, Self::default(), None)) + } +} diff --git a/did_peer/src/peer_did_resolver/resolver.rs b/did_peer/src/peer_did_resolver/resolver.rs index 4e43bdc7be..3e5f6c19ef 100644 --- a/did_peer/src/peer_did_resolver/resolver.rs +++ b/did_peer/src/peer_did_resolver/resolver.rs @@ -9,11 +9,7 @@ use did_resolver::{ }, }; -use crate::{ - error::DidPeerError, - numalgos::numalgo2::resolve_numalgo2, - peer_did::{Numalgo, PeerDid}, -}; +use crate::{error::DidPeerError, numalgos::numalgo2::resolve_numalgo2, peer_did::GenericPeerDid}; use super::options::ExtraFieldsOptions; @@ -35,9 +31,9 @@ impl DidResolvable for PeerDidResolver { did: &Did, options: &DidResolutionOptions, ) -> Result, GenericError> { - let peer_did = PeerDid::parse(did.to_owned())?; - match peer_did.numalgo() { - Numalgo::MultipleInceptionKeys => { + let peer_did = GenericPeerDid::parse(did.to_owned())?; + match peer_did { + GenericPeerDid::Numalgo2(peer_did) => { let did_doc = resolve_numalgo2(&peer_did.did(), options.extra().public_key_encoding())?; let resolution_metadata = DidResolutionMetadata::builder() .content_type("application/did+json".to_string()) @@ -45,7 +41,7 @@ impl DidResolvable for PeerDidResolver { let builder = DidResolutionOutput::builder(did_doc).did_resolution_metadata(resolution_metadata); Ok(builder.build()) } - n @ _ => Err(Box::new(DidPeerError::UnsupportedNumalgo(n.clone()))), + n @ _ => Err(Box::new(DidPeerError::UnsupportedNumalgo(n.numalgo()))), } } } diff --git a/did_peer/tests/generate.rs b/did_peer/tests/generate.rs index c857bd7bad..4c0b2f1b61 100644 --- a/did_peer/tests/generate.rs +++ b/did_peer/tests/generate.rs @@ -2,7 +2,7 @@ mod fixtures; use did_doc::schema::did_doc::DidDocument; use did_doc_sov::extra_fields::ExtraFieldsSov; -use did_peer::peer_did::PeerDid; +use did_peer::peer_did::{numalgo2::Numalgo2, numalgo3::Numalgo3, PeerDid}; use crate::fixtures::{ basic::{DID_DOC_BASIC, PEER_DID_NUMALGO_2_BASIC, PEER_DID_NUMALGO_3_BASIC}, @@ -21,8 +21,8 @@ macro_rules! generate_test_numalgo2 { fn $test_name() { let did_document = serde_json::from_str::>($did_doc).unwrap(); assert_eq!( - PeerDid::parse($peer_did.to_string()).unwrap(), - PeerDid::generate_numalgo2(did_document).unwrap() + PeerDid::::from_did($peer_did.to_string()).unwrap(), + PeerDid::::generate_numalgo2(did_document).unwrap() ); } }; @@ -34,8 +34,8 @@ macro_rules! generate_test_numalgo3 { fn $test_name() { let did_document = serde_json::from_str::>($did_doc).unwrap(); assert_eq!( - PeerDid::parse($peer_did.to_string()).unwrap(), - PeerDid::generate_numalgo3(did_document).unwrap() + PeerDid::::from_did($peer_did.to_string()).unwrap(), + PeerDid::::generate_numalgo3(did_document).unwrap() ); } };