summaryrefslogtreecommitdiff
path: root/ocaml/test/old/inspect_event4_detail.ml
blob: 4f4f30a3e0cb7a3da24789f64c3ba151fa8fa80f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
(* Inspect Event 4 in detail *)

open Nock_lib

let to_atom_if_small noun =
  match noun with
  | Noun.Atom a ->
      if Z.numbits a <= 32 then
        Printf.sprintf "Atom(%s / 0x%s)" (Z.to_string a) (Z.format "x" a)
      else
        Printf.sprintf "Atom(large, %d bits)" (Z.numbits a)
  | Noun.Cell _ -> "Cell"

let rec to_list acc noun =
  match noun with
  | Noun.Atom _ -> List.rev acc
  | Noun.Cell (item, rest) -> to_list (item :: acc) rest

let inspect _env =
  let in_channel = open_in_bin "solid.noun" in
  let pill = (Marshal.from_channel in_channel : Noun.noun) in
  close_in in_channel;

  match pill with
  | Noun.Cell (_tag, events) ->
      let event_list = to_list [] events in

      (* Event 3 *)
      Printf.printf "=== EVENT 3 ===\n\n";
      begin match List.nth_opt event_list 3 with
      | Some (Noun.Cell (wire, card)) ->
          Printf.printf "Event 3: [wire card]\n\n";

          Printf.printf "Wire:\n";
          Printf.printf "  %s\n" (to_atom_if_small wire);

          (* If wire is a cell (path), show first few elements *)
          begin match wire with
          | Noun.Cell (w1, rest1) ->
              Printf.printf "  Head: %s\n" (to_atom_if_small w1);
              begin match rest1 with
              | Noun.Cell (w2, rest2) ->
                  Printf.printf "  [1]: %s\n" (to_atom_if_small w2);
                  begin match rest2 with
                  | Noun.Cell (w3, _) ->
                      Printf.printf "  [2]: %s\n" (to_atom_if_small w3)
                  | Noun.Atom a ->
                      Printf.printf "  Tail: Atom(%s)\n" (Z.to_string a)
                  end
              | Noun.Atom a ->
                  Printf.printf "  Tail: Atom(%s)\n" (Z.to_string a)
              end
          | Noun.Atom _ -> ()
          end;

          Printf.printf "\nCard:\n";
          begin match card with
          | Noun.Cell (term, data) ->
              Printf.printf "  [term data]\n";
              Printf.printf "  Term: %s\n" (to_atom_if_small term);
              (* Try to convert term to ASCII *)
              begin match term with
              | Noun.Atom a when Z.numbits a <= 32 ->
                  let bytes = Z.to_bits a in
                  Printf.printf "  Term ASCII: '%s'\n" bytes
              | _ -> ()
              end;
              Printf.printf "  Data: %s\n" (to_atom_if_small data)
          | Noun.Atom a ->
              Printf.printf "  Atom: %s\n" (Z.to_string a)
          end

      | _ -> Printf.printf "Event 3 not found or wrong format\n"
      end;

      Printf.printf "\n═══════════════════════════════════════\n\n";

      (* Event 4 *)
      Printf.printf "=== EVENT 4 ===\n\n";
      begin match List.nth_opt event_list 4 with
      | Some (Noun.Cell (wire, card)) ->
          Printf.printf "Event 4: [wire card]\n\n";

          Printf.printf "Wire:\n";
          Printf.printf "  %s\n" (to_atom_if_small wire);

          begin match wire with
          | Noun.Cell (w1, rest1) ->
              Printf.printf "  Head: %s\n" (to_atom_if_small w1);
              begin match rest1 with
              | Noun.Cell (w2, rest2) ->
                  Printf.printf "  [1]: %s\n" (to_atom_if_small w2);
                  begin match rest2 with
                  | Noun.Cell (w3, _) ->
                      Printf.printf "  [2]: %s\n" (to_atom_if_small w3)
                  | Noun.Atom a ->
                      Printf.printf "  Tail: Atom(%s)\n" (Z.to_string a)
                  end
              | Noun.Atom a ->
                  Printf.printf "  Tail: Atom(%s)\n" (Z.to_string a)
              end
          | Noun.Atom _ -> ()
          end;

          Printf.printf "\nCard:\n";
          begin match card with
          | Noun.Cell (term, data) ->
              Printf.printf "  [term data]\n";
              Printf.printf "  Term: %s\n" (to_atom_if_small term);
              (* Try to convert term to ASCII *)
              begin match term with
              | Noun.Atom a when Z.numbits a <= 32 ->
                  let bytes = Z.to_bits a in
                  Printf.printf "  Term ASCII: '%s'\n" bytes
              | _ -> ()
              end;
              Printf.printf "  Data: %s\n" (to_atom_if_small data)
          | Noun.Atom a ->
              Printf.printf "  Atom: %s\n" (Z.to_string a)
          end

      | _ -> Printf.printf "Event 4 not found or wrong format\n"
      end

  | Noun.Atom _ ->
      Printf.printf "Pill is atom\n"

let () =
  Printf.printf "\n═══════════════════════════════════════\n";
  Printf.printf " Inspect Events 3 and 4 in Detail\n";
  Printf.printf "═══════════════════════════════════════\n\n";
  Eio_main.run inspect