// edge.el — Edge type definitions and visual encoding. // // Edges are directed (source -> target) with a weight and optional relation label. // ── Edge JSON accessors ────────────────────────────────────────────────────── // // Edges are passed as JSON objects: { source_id, target_id, weight, relation } fn edge_source(e_json: String) -> String { let s: String = json_get_string(e_json, "source_id") if !str_eq(s, "") { return s } json_get_string(e_json, "source") } fn edge_target(e_json: String) -> String { let t: String = json_get_string(e_json, "target_id") if !str_eq(t, "") { return t } json_get_string(e_json, "target") } fn edge_weight(e_json: String) -> Float { let w: Float = json_get_float(e_json, "weight") if w == int_to_float(0) { return int_to_float(1) } w } fn edge_relation(e_json: String) -> String { json_get_string(e_json, "relation") } // ── Edge visual encoding ───────────────────────────────────────────────────── // Stroke width clamped to [1, 4] based on weight. fn edge_stroke_width(weight: Float) -> Float { let min_w: Float = int_to_float(1) let max_w: Float = int_to_float(4) let range: Float = max_w - min_w let clamped: Float = if weight < min_w { min_w } else { if weight > max_w { max_w } else { weight } } clamped } fn edge_stroke_color() -> String { "#3a4a5a" } fn edge_stroke_color_highlight() -> String { "#5a7a9a" }