xdid-method-key 0.8.0

xdid implementation of did:key
Documentation
//! [xdid](https://github.com/unavi-xyz/xdid) implementation of [did:key](https://w3c-ccg.github.io/did-method-key/).

use parser::DidKeyParser;
use xdid_core::{
    Method,
    MethodFuture,
    ResolutionError,
    did::Did,
    did_url::url::DidUrl,
    document::{
        Document,
        VerificationMethod,
        VerificationMethodMap,
    },
};

pub mod keys;
mod parser;

const NAME: &str = "key";

pub struct MethodDidKey;

impl Method for MethodDidKey {
    fn method_name(&self) -> &'static str {
        NAME
    }

    fn resolve(&self, did: Did) -> MethodFuture<Result<Document, ResolutionError>> {
        Box::pin(async move { resolve_inner(did) })
    }
}

fn resolve_inner(did: Did) -> Result<Document, ResolutionError> {
    if did.method_name.as_str() != NAME {
        return Err(ResolutionError::InvalidDid);
    }

    let parser = DidKeyParser::default();
    let did_key = parser
        .parse(&did)
        .map_err(|_| ResolutionError::InvalidDid)?;

    let did_url = DidUrl::new(did.clone(), None, None, Some(did.method_id.as_str().into()))
        .map_err(|_| ResolutionError::InvalidDid)?;

    Ok(Document {
        context:               None,
        id:                    did.clone(),
        also_known_as:         None,
        controller:            None,
        verification_method:   Some(vec![VerificationMethodMap {
            id:                   did_url.clone(),
            typ:                  "JsonWebKey2020".into(),
            controller:           did,
            public_key_jwk:       Some(did_key.to_jwk()),
            public_key_multibase: None,
        }]),
        authentication:        Some(vec![VerificationMethod::Url(did_url.clone())]),
        assertion_method:      Some(vec![VerificationMethod::Url(did_url.clone())]),
        capability_invocation: Some(vec![VerificationMethod::Url(did_url.clone())]),
        capability_delegation: Some(vec![VerificationMethod::Url(did_url)]),
        service:               None,
        key_agreement:         None,
    })
}