KeiSeiKit-1.0/_primitives/_rust/kei-discover/src/entry.rs
Parfii-bot a4e667de10 KeiSeiKit-public — clean state
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.
2026-05-01 12:09:03 +08:00

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()
}