tawasuyu

tawasuyu/brahman

Rust 326TOML 123JSON 17Markdown 144606 Definiciones

⎇ d3649bfd1a80153652c2a028315369bb4b184024 crates/modules/tahuantinsuyu/tahuantinsuyu-card/src/lib.rs Rust · 89 líneas · 2.9 KB Historia Quién tocó qué crudo

feat(tahuantinsuyu): scaffolding del estudio astrológico (10 crates + ventana 3-panes) c48638fe8 · 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
11use std::collections::BTreeSet;
12
13use brahman_card::{
14    Card, Flow, Flows, FsPolicy, IpcPolicy, Lifecycle, Payload, Permissions, Priority, Supervision,
15    TypeRef, CARD_SCHEMA_VERSION,
16};
17use ulid::Ulid;
18
19/// Label canónico — coincide con el binario y aparece en `ListEntes`.
20pub const LABEL: &str = "brahman.tahuantinsuyu";
21
22/// Spawn fire-and-forget. Si el Init no está corriendo, el sidecar
23/// loggea y termina; la app sigue ejecutándose standalone.
24pub fn spawn_sidecar() {
25    brahman_sidecar::spawn(build_card());
26}
27
28/// Construye la Card. Expuesto público para tests + para shells que
29/// quieran inspeccionar el manifiesto antes de spawnear.
30pub fn build_card() -> Card {
31    Card {
32        schema_version: CARD_SCHEMA_VERSION,
33        id: Ulid::new(),
34        lineage: None,
35        label: LABEL.into(),
36        provides: BTreeSet::new(),
37        requires: BTreeSet::new(),
38        payload: Payload::Virtual,
39        supervision: Supervision::Delegate,
40        lifecycle: Lifecycle::Widget,
41        priority: Priority::Normal,
42        permissions: Permissions {
43            // La app guarda su DB SQLite en disco; necesita RW filesystem.
44            filesystem: FsPolicy::ReadWrite,
45            ipc: IpcPolicy {
46                allow: vec!["wit-v1".into()],
47            },
48            ..Default::default()
49        },
50        flow: Flows {
51            // Recibe peticiones de cómputo (carta natal, transit, etc.)
52            // serializadas como JSON. La forma exacta la define
53            // `tahuantinsuyu-engine`.
54            input: vec![Flow {
55                name: "chart-request".into(),
56                ty: TypeRef::Primitive {
57                    name: "json".into(),
58                },
59                pin_to: None,
60            }],
61            // Publica el resultado de un cómputo (placements, aspectos,
62            // casas) también como JSON. Otras apps brahman pueden
63            // consumirlo para visualizar o derivar.
64            output: vec![Flow {
65                name: "chart-result".into(),
66                ty: TypeRef::Primitive {
67                    name: "json".into(),
68                },
69                pin_to: None,
70            }],
71        },
72        ..Default::default()
73    }
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    fn card_label_and_flow() {
82        let c = build_card();
83        assert_eq!(c.label, LABEL);
84        assert_eq!(c.flow.input.len(), 1);
85        assert_eq!(c.flow.output.len(), 1);
86        assert_eq!(c.flow.input[0].name, "chart-request");
87        assert_eq!(c.flow.output[0].name, "chart-result");
88    }
89}