// ===== Observer 视图模型纯核(数据面——rpc:call 应答形状的规约面)=====
// 职责:rpc 应答(beam-rpc EtfVal)→面板视图模型(进程表/树/ETS/内存/端口)。
// 渲染(MoUI)藏 RenderPort trait 后——数据面纯核,渲染位组合根装配。
///|
pub(all) suberror ViewError {
ShapeMismatch(String) // rpc 应答形不符(规约面诚实拒)
}
///|
/// 进程行(pid 标识+name+初始函数+内存+消息队列长)
pub(all) struct ProcessRow {
pid : String
name : String
initial_call : String
memory_words : Int32
message_queue_len : Int32
}
///|
/// ETS 表行(表名+类型+大小)
pub(all) struct EtsRow {
name : String
kind : String // set/ordered_set/bag/duplicate_bag
size : Int32
}
///|
/// sup 树节点(子项 id+类型+子树)
pub(all) struct SupNode {
name : String
children : Array[SupChild]
}
///|
pub(all) struct SupChild {
child_id : String
kind : String // worker/supervisor
}
///|
/// 内存摘要(total/processes/ets/atom——词对应 erlang:memory() 键)
pub(all) struct MemorySummary {
mut total : Int32
mut processes : Int32
mut ets : Int32
mut atom : Int32
}
///|
/// 渲染注入位(MoUI 组合根实现;数据面纯核零渲染依赖)
pub(open) trait RenderPort {
fn render_processes(self : Self, rows : Array[ProcessRow]) -> Unit
fn render_ets(self : Self, rows : Array[EtsRow]) -> Unit
fn render_sup_tree(self : Self, tree : SupNode) -> Unit
fn render_memory(self : Self, mem : MemorySummary) -> Unit
fn render_ports(self : Self, count : Int32) -> Unit
}
///|
/// 视图模型:承载 rpc 客户端注入(beam-rpc call 面)的快照拉取编排位
pub struct Observer {
fetch : &FetchPort
}
///|
/// 构造(生产面 API——组合根装配位)
pub fn Observer::new(fetch~ : &FetchPort) -> Observer {
{ fetch, }
}
///|
/// FetchPort(数据源注入位——beam-rpc call 组合;观察器不直摸 rpc 词)
pub(open) trait FetchPort {
// 进程信息(erlang:processes()+process_info 摘要——骨架形:行文本列)
// async 契约(beam-rpc RpcPort async 同形——色随 trait 声明)
async fn fetch_processes(self : Self) -> Array[ProcessRow] raise ViewError
// ETS 表清单(ets:all()+info 形)
async fn fetch_ets(self : Self) -> Array[EtsRow] raise ViewError
// sup 树(supervisor:which_children 递归——骨架形:单层)
async fn fetch_sup_tree(self : Self, sup : String) -> SupNode raise ViewError
// 内存摘要(erlang:memory() 词对)
async fn fetch_memory(self : Self) -> MemorySummary raise ViewError
// 端口计数(erlang:ports() 长)
async fn fetch_ports(self : Self) -> Int32 raise ViewError
}
///|
/// 面板全量刷新(编排:五 fetch→五 render——段段透传,零静默吞错)
pub async fn Observer::refresh(
self : Observer,
render : &RenderPort,
) -> Unit raise ViewError {
render.render_processes(self.fetch.fetch_processes())
render.render_ets(self.fetch.fetch_ets())
render.render_sup_tree(self.fetch.fetch_sup_tree("kernel_sup"))
render.render_memory(self.fetch.fetch_memory())
render.render_ports(self.fetch.fetch_ports())
}