im-core 0.1.0

Rust IM SDK for Awiki clients built on Agent Network Protocol (ANP)
Documentation
use serde_json::{json, Map, Value};

use super::common::{self, WireIdentity};

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct HistoryWireRequest {
    pub peer_did: String,
    pub limit: i64,
    pub cursor: Option<String>,
    pub skip: i64,
    pub auth: Option<HistoryWireAuth>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct HistoryWireAuth {
    pub inbox_owner_did: String,
    pub inbox_auth_verification_method: String,
    pub service_did: String,
}

pub(crate) fn build_history_rpc_params(
    identity: &WireIdentity,
    request: HistoryWireRequest,
) -> crate::ImResult<Value> {
    if request.peer_did.is_empty() {
        return Err(crate::ImError::invalid_input(
            Some("peer_did".to_string()),
            "peer_did must not be empty",
        ));
    }
    let limit = if request.limit <= 0 {
        50
    } else {
        request.limit
    };
    let mut body = Map::new();
    let owner_did = request
        .auth
        .as_ref()
        .map(|auth| auth.inbox_owner_did.clone())
        .unwrap_or_else(|| identity.did.clone());
    let service_did = request.auth.as_ref().map(|auth| auth.service_did.clone());
    let delegated = request.auth.is_some();
    body.insert("user_did".to_string(), Value::String(owner_did.clone()));
    body.insert("peer_did".to_string(), Value::String(request.peer_did));
    body.insert("limit".to_string(), json!(limit));
    if let Some(cursor) = request.cursor.filter(|cursor| !cursor.is_empty()) {
        body.insert("since_seq".to_string(), Value::String(cursor));
    }
    if request.skip > 0 {
        body.insert("skip".to_string(), json!(request.skip));
    }
    if let Some(auth) = request.auth {
        body.insert(
            "inbox_owner_did".to_string(),
            Value::String(auth.inbox_owner_did),
        );
        body.insert(
            "inbox_auth_verification_method".to_string(),
            Value::String(auth.inbox_auth_verification_method),
        );
    }
    Ok(json!({
        "meta": if delegated {
            common::delegated_local_meta(
                &owner_did,
                service_did.as_deref().unwrap_or(""),
                "anp.direct.local.v1",
            )
        } else {
            common::local_meta(&owner_did, "anp.direct.local.v1")
        },
        "body": body,
    }))
}