menmos 0.2.6

High-Level SDK for the menmos platform
Documentation
use std::path::PathBuf;

use menmos_client::{ClientError, Meta};

use snafu::prelude::*;

use crate::error;
use crate::metadata_detector::MetadataDetectorRC;
use crate::{ClientRC, UploadRequest};

#[derive(Debug, Snafu)]
pub enum PushError {
    MetadataPopulationError {
        source: error::MetadataDetectorError,
    },
    #[snafu(display("failed to push '{:?}'", path))]
    BlobPushError { path: PathBuf, source: ClientError },
}

type Result<T> = std::result::Result<T, PushError>;

pub struct PushResult {
    pub source_path: PathBuf,
    pub blob_id: String,
}

pub(crate) async fn push_file(
    client: ClientRC,
    metadata_detector: &MetadataDetectorRC,
    request: UploadRequest,
) -> Result<String> {
    let mut meta = Meta::new();

    meta = meta.with_field(
        "name",
        request
            .path
            .file_name()
            .unwrap()
            .to_string_lossy()
            .to_string(),
    );

    metadata_detector
        .populate(&request.path, &mut meta)
        .context(MetadataPopulationSnafu)?;

    for tag in request.tags.iter() {
        meta = meta.with_tag(tag);
    }

    for (k, v) in request.fields.iter() {
        meta = meta.with_field(k, v.clone());
    }

    let item_id = client
        .push(&request.path, meta)
        .await
        .with_context(|_| BlobPushSnafu {
            path: request.path.clone(),
        })?;

    Ok(item_id)
}