gioser

tawasuyu/brahman

Rust 307TOML 110JSON 14Markdown 113941 Sutichaykuna

⎇ e2da24239e1e1fe440aa4497e734b9fa8b3457eb crates/modules/tahuantinsuyu/tahuantinsuyu-card/src/lib.rs Rust · 95 siq'ikuna · 3.2 KB Ñawpa willay Pi imata llamkarqan ch'uya

feat(tahuantinsuyu): fase 26 — data plane brahman real (service socket + CLI) e2da24239 · sergio ·

1//! `tahuantinsuyu-card` — Tarjeta de Presentación + sidecar de la app.
2//!
3//! Cualquier binario que levante Tahuantinsuyu llama [`spawn_sidecar`]
4//! antes de abrir la ventana GPUI. La lógica de thread / tokio /
5//! ping-loop vive en `brahman-sidecar`; aquí solo declaramos quién es
6//! Tahuantinsuyu como módulo Brahman.
7
8#![forbid(unsafe_code)]
9#![warn(rust_2018_idioms)]
10
11pub mod service;
12
13use std::collections::BTreeSet;
14
15use brahman_card::{
16    Card, Flow, Flows, FsPolicy, IpcPolicy, Lifecycle, Payload, Permissions, Priority, Supervision,
17    TypeRef, CARD_SCHEMA_VERSION,
18};
19use ulid::Ulid;
20
21/// Label canónico — coincide con el binario y aparece en `ListEntes`.
22pub const LABEL: &str = "brahman.tahuantinsuyu";
23
24/// Spawn fire-and-forget. Si el Init no está corriendo, el sidecar
25/// loggea y termina; la app sigue ejecutándose standalone.
26pub fn spawn_sidecar() {
27    brahman_sidecar::spawn(build_card());
28}
29
30/// Construye la Card. Expuesto público para tests + para shells que
31/// quieran inspeccionar el manifiesto antes de spawnear. Anuncia el
32/// path del service socket en `Card.service_socket` para que otros
33/// módulos brahman, después de matchear via el broker, puedan conectar
34/// directo al data plane.
35pub fn build_card() -> Card {
36    Card {
37        schema_version: CARD_SCHEMA_VERSION,
38        id: Ulid::new(),
39        lineage: None,
40        label: LABEL.into(),
41        service_socket: Some(service::default_service_socket()),
42        provides: BTreeSet::new(),
43        requires: BTreeSet::new(),
44        payload: Payload::Virtual,
45        supervision: Supervision::Delegate,
46        lifecycle: Lifecycle::Widget,
47        priority: Priority::Normal,
48        permissions: Permissions {
49            // La app guarda su DB SQLite en disco; necesita RW filesystem.
50            filesystem: FsPolicy::ReadWrite,
51            ipc: IpcPolicy {
52                allow: vec!["wit-v1".into()],
53            },
54            ..Default::default()
55        },
56        flow: Flows {
57            // Recibe peticiones de cómputo (carta natal, transit, etc.)
58            // serializadas como JSON. La forma exacta la define
59            // `tahuantinsuyu-engine`.
60            input: vec![Flow {
61                name: "chart-request".into(),
62                ty: TypeRef::Primitive {
63                    name: "json".into(),
64                },
65                pin_to: None,
66            }],
67            // Publica el resultado de un cómputo (placements, aspectos,
68            // casas) también como JSON. Otras apps brahman pueden
69            // consumirlo para visualizar o derivar.
70            output: vec![Flow {
71                name: "chart-result".into(),
72                ty: TypeRef::Primitive {
73                    name: "json".into(),
74                },
75                pin_to: None,
76            }],
77        },
78        ..Default::default()
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use super::*;
85
86    #[test]
87    fn card_label_and_flow() {
88        let c = build_card();
89        assert_eq!(c.label, LABEL);
90        assert_eq!(c.flow.input.len(), 1);
91        assert_eq!(c.flow.output.len(), 1);
92        assert_eq!(c.flow.input[0].name, "chart-request");
93        assert_eq!(c.flow.output[0].name, "chart-result");
94    }
95}