⎇ d3649bfd1a80153652c2a028315369bb4b184024
crates/modules/tahuantinsuyu/tahuantinsuyu-card/src/lib.rs
Historia
Quién tocó qué
crudo
feat(tahuantinsuyu): scaffolding del estudio astrológico (10 crates + ventana 3-panes)
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}