edc-connector-client 0.5.0

A Rust client for EDC
Documentation
use std::sync::LazyLock;

use serde::{Deserialize, Serialize};
use serde_json::{json, Value};

use crate::EDC_NAMESPACE;

const ODRL_CONTEXT: &str = "http://www.w3.org/ns/odrl.jsonld";
const EDC_V4_CONTEXT: &str = "https://w3id.org/edc/connector/management/v2";

static DEFAULT_CONTEXT_JSON: LazyLock<Value> = LazyLock::new(|| json!({ "@vocab": EDC_NAMESPACE }));
static ODRL_CONTEXT_JSON: LazyLock<Value> =
    LazyLock::new(|| json!([ ODRL_CONTEXT,{ "@vocab": EDC_NAMESPACE }]));

static EDC_V4_CONTEXT_JSON: LazyLock<Value> = LazyLock::new(|| json!([EDC_V4_CONTEXT]));

#[derive(Deserialize, Debug)]
pub struct WithContext<T> {
    #[allow(dead_code)]
    #[serde(rename = "@context")]
    context: Value,
    #[serde(flatten)]
    pub(crate) inner: T,
}

#[derive(Serialize, Debug)]
pub struct WithContextRef<'a, T> {
    #[serde(rename = "@context")]
    context: Value,
    #[serde(flatten)]
    inner: &'a T,
}

impl<'a, T> WithContextRef<'a, T> {
    pub fn new(context: Value, inner: &'a T) -> WithContextRef<'a, T> {
        WithContextRef { context, inner }
    }

    pub fn default_context(inner: &'a T) -> WithContextRef<'a, T> {
        WithContextRef::new(DEFAULT_CONTEXT_JSON.clone(), inner)
    }

    pub fn edc_v4_context(inner: &'a T) -> WithContextRef<'a, T> {
        WithContextRef::new(EDC_V4_CONTEXT_JSON.clone(), inner)
    }

    pub fn odrl_context(inner: &'a T) -> WithContextRef<'a, T> {
        WithContextRef::new(ODRL_CONTEXT_JSON.clone(), inner)
    }
}

impl<T> WithContext<T> {
    pub fn new(context: Value, inner: T) -> WithContext<T> {
        WithContext { context, inner }
    }
}