⎇ e2da24239e1e1fe440aa4497e734b9fa8b3457eb
crates/modules/tahuantinsuyu/tahuantinsuyu-card/src/lib.rs
Historia
Quién tocó qué
crudo
feat(tahuantinsuyu): fase 26 — data plane brahman real (service socket + CLI)
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}