open Core_kernel let print_binio t bin_writer_t = let buf = Bin_prot.Utils.bin_dump bin_writer_t t in let len = Bin_prot.Common.buf_len buf in let ts = Array.init len ~f:(fun i -> buf.{i} |> Char.to_int) in Stdio.printf "%s\n%!" ([%sexp_of: int array] ts |> Sexp.to_string_mach) module MorePancakes = struct type t = int * float * int [@@deriving bin_io, sexp_of] let%expect_test _ = let t = 12, 3.141592, 1234567890123 in print_binio t bin_writer_t; [%expect {| (12 122 0 139 252 250 33 9 64 252 203 4 251 113 31 1 0 0) |}] end module Breakfasts = struct type t = { pancakes : int ; more_pancakes : MorePancakes.t ; value1 : int ; value2 : float * float } [@@deriving bin_io, sexp_of] let%expect_test _ = let t = { pancakes = 12 ; more_pancakes = -123, 2.71828182846, 0 ; value1 = -1234567890123456 ; value2 = 3.141592, 6535.8979 } in print_binio t bin_writer_t; [%expect {| (12 255 133 207 95 20 139 10 191 5 64 0 252 64 69 117 195 42 157 251 255 122 0 139 252 250 33 9 64 20 63 198 220 229 135 185 64) |}] end module BreakfastItem = struct type t = { name : string ; quantity : float ; large : bool } [@@deriving bin_io] let%expect_test _ = let t = { name = "egg"; quantity = 3.1415; large = true } in print_binio t bin_writer_t; let t = { name = "croissant"; quantity = -12345.; large = false } in print_binio t bin_writer_t; let t = { name = "PainAuChocolat"; quantity = 299792458.; large = false } in print_binio t bin_writer_t; [%expect {| (3 101 103 103 111 18 131 192 202 33 9 64 1) (9 99 114 111 105 115 115 97 110 116 0 0 0 0 128 28 200 192 0) (14 80 97 105 110 65 117 67 104 111 99 111 108 97 116 0 0 0 74 120 222 177 65 0) |}] end module BreakfastMenu = struct type 'a t = | Any of 'a | Eggs of int | Pancakes of int | MorePancakes of MorePancakes.t | LotsOfPancakes of int * MorePancakes.t | Everything of { eggs : int ; pancakes : int } | Nothing [@@deriving bin_io] let%expect_test _ = let t = Any (Everything { eggs = 123; pancakes = 456 }) in print_binio t (bin_writer_t (bin_writer_t Int.bin_writer_t)); let t = Eggs 42 in print_binio t (bin_writer_t (bin_writer_t Int.bin_writer_t)); [%expect {| (0 5 123 254 200 1) (1 42) |}] end module BreakfastPoly = struct type 'a t = [ `Any of 'a | `Eggs of int | `Pancakes of int | `MorePancakes of MorePancakes.t | `LotsOfPancakes of int * MorePancakes.t | `Nothing ] [@@deriving bin_io] let%expect_test _ = let t = `Any (`MorePancakes (-123, 2.71828182846, 0)) in print_binio t (bin_writer_t (bin_writer_t Int.bin_writer_t)); let t = `Eggs 42 in print_binio t (bin_writer_t (bin_writer_t Int.bin_writer_t)); [%expect {| (153 101 99 0 39 152 92 190 255 133 207 95 20 139 10 191 5 64 0) (93 118 212 91 42) |}] end module BreakfastRec = struct type t = | Empty | Cons of MorePancakes.t * t [@@deriving bin_io, sexp_of] let%expect_test _ = let rec create = function | 0 -> Empty | size -> let i = size - 1 in Cons ((i, 3.14, i * i), create (size - 1)) in let t = create 0 in print_binio t bin_writer_t; let t = create 1 in print_binio t bin_writer_t; let t = create 5 in print_binio t bin_writer_t; [%expect {| (0) (1 0 31 133 235 81 184 30 9 64 0 0) (1 4 31 133 235 81 184 30 9 64 16 1 3 31 133 235 81 184 30 9 64 9 1 2 31 133 235 81 184 30 9 64 4 1 1 31 133 235 81 184 30 9 64 1 1 0 31 133 235 81 184 30 9 64 0 0) |}] end module BreakfastStr = struct type t = { str : string ; bytes : bytes } [@@deriving bin_io, sexp_of] let%expect_test _ = let t = { str = "pancakes"; bytes = Bytes.of_string "more-pancakes" } in print_binio t bin_writer_t; [%expect {| (8 112 97 110 99 97 107 101 115 13 109 111 114 101 45 112 97 110 99 97 107 101 115) |}] end