amagi 0.1.3

Rust SDK, CLI, and Web API service skeleton for multi-platform social web adapters.
Documentation
use serde_json::{Map, Value};

use crate::platforms::kuaishou::{KuaishouJsonObject, KuaishouJsonValue, KuaishouUserWorkList};

pub(super) fn json_value_to_value(value: &KuaishouJsonValue) -> Value {
    match value {
        KuaishouJsonValue::Null => Value::Null,
        KuaishouJsonValue::Bool(value) => Value::Bool(*value),
        KuaishouJsonValue::Number(value) => value
            .parse::<serde_json::Number>()
            .map(Value::Number)
            .unwrap_or_else(|_| Value::String(value.clone())),
        KuaishouJsonValue::String(value) => Value::String(value.clone()),
        KuaishouJsonValue::Array(values) => {
            Value::Array(values.iter().map(json_value_to_value).collect())
        }
        KuaishouJsonValue::Object(value) => json_object_to_value(value),
    }
}

pub(super) fn json_object_to_value(value: &KuaishouJsonObject) -> Value {
    let mut object = Map::new();

    for (key, inner) in value.entries() {
        object.insert(key.clone(), json_value_to_value(inner));
    }

    Value::Object(object)
}

pub(super) fn resolve_kuaishou_user_work_list(
    principal_id: &str,
    payload: &Value,
) -> KuaishouUserWorkList {
    let data = payload
        .get("data")
        .and_then(Value::as_object)
        .cloned()
        .unwrap_or_default();
    let list = data
        .get("list")
        .and_then(Value::as_array)
        .cloned()
        .unwrap_or_default();
    let pcursor = data
        .get("pcursor")
        .and_then(Value::as_str)
        .unwrap_or_default()
        .to_owned();
    let has_more = data
        .get("hasMore")
        .and_then(Value::as_bool)
        .unwrap_or_else(|| !pcursor.is_empty());
    let result = data.get("result").and_then(Value::as_i64).unwrap_or(0);

    KuaishouUserWorkList {
        principal_id: principal_id.to_owned(),
        list,
        pcursor,
        has_more,
        result,
        upstream_payload: unwrap_data_payload(payload),
    }
}

pub(super) fn unwrap_data_payload(payload: &Value) -> Value {
    payload
        .get("data")
        .cloned()
        .unwrap_or_else(|| payload.clone())
}