From 5431cdfda2735df370c5d536479a74ff82cd513f Mon Sep 17 00:00:00 2001 From: Miroslav Kovar Date: Mon, 12 Jun 2023 17:07:50 +0200 Subject: [PATCH] Fail early - try converting all services Signed-off-by: Miroslav Kovar --- did_doc_sov/src/lib.rs | 10 ++++++++-- did_doc_sov/src/service/services_list.rs | 15 ++++++--------- did_doc_sov/tests/builder.rs | 15 +++++++++------ did_doc_sov/tests/serde.rs | 9 +++++---- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/did_doc_sov/src/lib.rs b/did_doc_sov/src/lib.rs index 6835a20627..165321df26 100644 --- a/did_doc_sov/src/lib.rs +++ b/did_doc_sov/src/lib.rs @@ -47,8 +47,14 @@ impl DidDocumentSov { self.did_doc.authentication() } - pub fn service(&self) -> ServicesList { - ServicesList::new(self.did_doc.service()) + pub fn service(&self) -> Result { + Ok(ServicesList::new( + self.did_doc + .service() + .iter() + .map(|s| ServiceSov::try_from(s.to_owned())) + .collect::, _>>()?, + )) } pub fn assertion_method(&self) -> &[VerificationMethodKind] { diff --git a/did_doc_sov/src/service/services_list.rs b/did_doc_sov/src/service/services_list.rs index b286ea4a08..c85946cda5 100644 --- a/did_doc_sov/src/service/services_list.rs +++ b/did_doc_sov/src/service/services_list.rs @@ -1,23 +1,20 @@ -use did_doc::schema::service::Service; - -use crate::{error::DidDocumentSovError, extra_fields::ExtraFieldsSov}; +use crate::error::DidDocumentSovError; use super::ServiceSov; -pub struct ServicesList<'a> { - services: &'a [Service], +pub struct ServicesList { + services: Vec, } -impl<'a> ServicesList<'a> { - pub fn new(services: &'a [Service]) -> Self { +impl ServicesList { + pub fn new(services: Vec) -> Self { Self { services } } - pub fn get(&self, index: usize) -> Result { + pub fn get(&self, index: usize) -> Result<&ServiceSov, DidDocumentSovError> { self.services .get(index) .ok_or(DidDocumentSovError::IndexOutOfBounds(index)) - .and_then(|service| ServiceSov::try_from(service.to_owned())) } pub fn len(&self) -> usize { diff --git a/did_doc_sov/tests/builder.rs b/did_doc_sov/tests/builder.rs index 2d69020a21..0564b0c403 100644 --- a/did_doc_sov/tests/builder.rs +++ b/did_doc_sov/tests/builder.rs @@ -20,8 +20,9 @@ fn test_service_build_aip1() { .add_service(ServiceSov::AIP1(service)) .unwrap() .build(); - assert_eq!(did_doc.service().len(), 1); - let first_service = did_doc.service().get(0).unwrap(); + let services = did_doc.service().unwrap(); + assert_eq!(services.len(), 1); + let first_service = services.get(0).unwrap(); assert_eq!(first_service.id().clone(), ID.parse::().unwrap()); assert_eq!( first_service.service_endpoint().clone(), @@ -50,8 +51,9 @@ fn test_service_build_didcommv1() { .add_service(ServiceSov::DIDCommV1(service)) .unwrap() .build(); - assert_eq!(did_doc.service().len(), 1); - let first_service = did_doc.service().get(0).unwrap(); + let services = did_doc.service().unwrap(); + assert_eq!(services.len(), 1); + let first_service = services.get(0).unwrap(); assert_eq!(first_service.id().clone(), ID.parse::().unwrap()); assert_eq!( first_service.service_endpoint().clone(), @@ -78,8 +80,9 @@ fn test_service_build_didcommv2() { .add_service(ServiceSov::DIDCommV2(service)) .unwrap() .build(); - assert_eq!(did_doc.service().len(), 1); - let first_service = did_doc.service().get(0).unwrap(); + let services = did_doc.service().unwrap(); + assert_eq!(services.len(), 1); + let first_service = services.get(0).unwrap(); assert_eq!(first_service.id().clone(), ID.parse::().unwrap()); assert_eq!( first_service.service_endpoint().clone(), diff --git a/did_doc_sov/tests/serde.rs b/did_doc_sov/tests/serde.rs index f2a06fadd0..502e661cd1 100644 --- a/did_doc_sov/tests/serde.rs +++ b/did_doc_sov/tests/serde.rs @@ -75,16 +75,17 @@ fn test_serde() { assert_eq!(did_doc.authentication().len(), 1); assert_eq!(did_doc.assertion_method().len(), 1); assert_eq!(did_doc.key_agreement().len(), 1); - assert_eq!(did_doc.service().len(), 3); + assert_eq!(did_doc.service().unwrap().len(), 3); - let first_service = did_doc.service().get(0).unwrap(); + let services = did_doc.service().unwrap(); + let first_service = services.get(0).unwrap(); assert_eq!( first_service.service_endpoint().to_string(), "https://example.com/endpoint" ); assert_eq!(first_service.service_type(), ServiceType::AIP1); - let second_service = did_doc.service().get(1).unwrap(); + let second_service = services.get(1).unwrap(); assert_eq!( second_service.id().to_string(), "did:sov:HR6vs6GEZ8rHaVgjg2WodM#did-communication" @@ -95,7 +96,7 @@ fn test_serde() { "https://example.com/endpoint" ); - let third_service = did_doc.service().get(2).unwrap(); + let third_service = services.get(2).unwrap(); assert_eq!( third_service.id().to_string(), "did:sov:HR6vs6GEZ8rHaVgjg2WodM#didcomm-1"