Single-commit clean baseline after security scrub of niche-tells, project codenames, internal jargon, and contributor-email leaks. Contents: - 100 Rust crates (_primitives/_rust/) - 37 agent manifests (_manifests/) + generated specs (_generated/) - 67 user-invocable skills (skills/) - 33 hooks (hooks/) - Composition blocks (_blocks/) - Documentation (docs/, README.md) - TS adapter packages (_ts_packages/) - Assembler (_assembler/) - Roles (_roles/) - Templates (_templates/) - Forgejo CI (.forgejo/) Author: Denis Parfionovich <info@greendragon.info> License: see LICENSE.
46 lines
1.4 KiB
Rust
46 lines
1.4 KiB
Rust
//! `Entry` — typed view of one `discover_index` row returned by
|
|
//! `list_available` / `search`.
|
|
//!
|
|
//! Conversion from the engine's `serde_json::Value` row is centralised
|
|
//! here so every public API function returns the same typed struct.
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
use serde_json::Value;
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub struct Entry {
|
|
pub id: i64,
|
|
pub slug: String,
|
|
pub author: String,
|
|
pub source_url: String,
|
|
pub description: String,
|
|
pub installed: bool,
|
|
pub last_seen_ts: i64,
|
|
pub created_at: i64,
|
|
pub updated_at: i64,
|
|
}
|
|
|
|
impl Entry {
|
|
/// Decode one row produced by `kei_entity_store::verbs::{get,list,search}`.
|
|
pub fn from_json(v: &Value) -> Self {
|
|
Self {
|
|
id: as_i64(v, "id"),
|
|
slug: as_str(v, "slug"),
|
|
author: as_str(v, "author"),
|
|
source_url: as_str(v, "source_url"),
|
|
description: as_str(v, "description"),
|
|
installed: as_i64(v, "installed") != 0,
|
|
last_seen_ts: as_i64(v, "last_seen_ts"),
|
|
created_at: as_i64(v, "created_at"),
|
|
updated_at: as_i64(v, "updated_at"),
|
|
}
|
|
}
|
|
}
|
|
|
|
fn as_i64(v: &Value, key: &str) -> i64 {
|
|
v.get(key).and_then(|x| x.as_i64()).unwrap_or(0)
|
|
}
|
|
|
|
fn as_str(v: &Value, key: &str) -> String {
|
|
v.get(key).and_then(|x| x.as_str()).unwrap_or("").to_string()
|
|
}
|