noosphere 0.16.1

A high-level package for dealing with accessing the Noosphere
Documentation
use std::sync::Arc;

use anyhow::{anyhow, Result};
use noosphere_core::{
    authority::{Author, Authorization},
    context::{SphereContext, SphereContextKey, AUTHORIZATION, IDENTITY, USER_KEY_NAME},
    data::Did,
};
use noosphere_storage::KeyValueStore;

use crate::{
    key::KeyStorage,
    sphere::{generate_db, SphereContextBuilder, SphereContextBuilderArtifacts},
};

pub async fn open_a_sphere(
    builder: SphereContextBuilder,
    sphere_identity: Option<Did>,
) -> Result<SphereContextBuilderArtifacts> {
    let storage_path = builder.require_storage_path()?.to_owned();
    let db = generate_db(
        storage_path,
        builder.scoped_storage_layout,
        sphere_identity,
        builder.ipfs_gateway_url,
        builder.storage_config,
    )
    .await?;

    let user_key_name: String = db.require_key(USER_KEY_NAME).await?;
    let authorization = db.get_key(AUTHORIZATION).await?.map(Authorization::Cid);

    let author = match builder.key_storage {
        Some(key_storage) => {
            let key: SphereContextKey =
                Arc::new(Box::new(key_storage.require_key(&user_key_name).await?));

            Author { key, authorization }
        }
        _ => return Err(anyhow!("Unable to resolve sphere author")),
    };

    let sphere_identity = db.require_key(IDENTITY).await?;
    let mut context = SphereContext::new(sphere_identity, author, db, None).await?;

    if builder.gateway_api.is_some() {
        context
            .configure_gateway_url(builder.gateway_api.as_ref())
            .await?;
    }

    Ok(SphereContextBuilderArtifacts::SphereOpened(context))
}