program main
  fn parse_text(text: string) -> (result i32 i32)
    call std.string.parse_i32_result : (result i32 i32)
      var text : string
  fn parse_stdin_text() -> (result i32 i32)
    local let input : unit
      call std.io.read_stdin_result : (result string i32)
    match : (result i32 i32)
      subject
        var input : (result string i32)
      arm ok text
        call std.string.parse_i32_result : (result i32 i32)
          var text : string
      arm err code
        err : (result i32 i32)
          var code : i32
  fn main() -> i32
    local let value : unit
      call parse_stdin_text : (result i32 i32)
    if : i32
      is_ok : bool
        var value : (result i32 i32)
      unwrap_ok : i32
        var value : (result i32 i32)
      unwrap_err : i32
        var value : (result i32 i32)
  test "parse 42 ok"
    binary = : bool
      unwrap_ok : i32
        call parse_text : (result i32 i32)
          string "42" : string
      int 42 : i32
  test "parse negative 7 ok"
    binary = : bool
      unwrap_ok : i32
        call parse_text : (result i32 i32)
          string "-7" : string
      int -7 : i32
  test "parse empty err"
    binary = : bool
      unwrap_err : i32
        call parse_text : (result i32 i32)
          string "" : string
      int 1 : i32
  test "parse trailing byte err"
    binary = : bool
      unwrap_err : i32
        call parse_text : (result i32 i32)
          string "12x" : string
      int 1 : i32
  test "parse overflow err"
    binary = : bool
      unwrap_err : i32
        call parse_text : (result i32 i32)
          string "2147483648" : string
      int 1 : i32
  test "parse stdin text structurally"
    local let value : unit
      call parse_stdin_text : (result i32 i32)
    match : bool
      subject
        var value : (result i32 i32)
      arm ok parsed
        binary = : bool
          var parsed : i32
          var parsed : i32
      arm err code
        binary = : bool
          var code : i32
          int 1 : i32
