witx 0.9.1

Parse and validate witx file format
Documentation

(witx
  (typename $u (union u8))
)
(witx
  (typename $tag (enum (@witx tag u8) $c))
  (typename $u (union (@witx tag $tag) u8))
)

(witx
  (typename $tag (enum $a $b))
  (typename $u (variant (@witx tag $tag) (case $a) (case $b u16)))
)

(witx
  (typename $tag (enum $a $b))
  (typename $u (variant (@witx tag $tag) (case $a) (case $b)))
)


(witx
 (typename $u
  (union
   u8
   u16
   u32
   u64
   s8
   s16
   s32
   s64
   f32
   f64
   (@witx usize)
   (@witx char8)
  )
 )
)

(assert_invalid
  (witx (typename $u (union (@witx tag $tag) u8 u16)))
  "Unknown name `tag`"
)

(assert_invalid
  (witx
    (typename $tag string)
    (typename $u (union (@witx tag $tag) u8 u16))
  )
  "Wrong kind of name `tag`: expected enum or builtin, got list"
)

(assert_invalid
  (witx
    (typename $tag (enum $c))
    (typename $u (variant (@witx tag $tag) (case $b u8)))
  )
  "Invalid union field `b`: does not correspond to variant in tag `tag`"
)

(assert_invalid
  (witx
    (typename $tag (enum $c))
    (typename $u (union (@witx tag $tag) f32 u8))
  )
  "Union expected 1 variants, found 2"
)

(assert_invalid
  (witx
    (typename $tag (enum $c $d))
    (typename $u (union (@witx tag $tag) f32))
  )
  "Union expected 2 variants, found 1"
)

(witx $d1
  (typename $tag (enum $a $b))
  (typename $u (union (@witx tag $tag) u8 u16))
)

(witx $d2
  (typename $tag (enum $a $b))
  (typename $u (variant (@witx tag $tag) (case $b u16) (case $a u8)))
)

;; These two unions should be represented the same:
(assert_representable eq $d1 "u" $d2 "u")
(assert_representable eq $d2 "u" $d1 "u")

;; Tag order doesnt matter for validation, but does for rep equality
(witx $d3
  (typename $tag (enum $b $a))
  (typename $u (union (@witx tag $tag) u16 u8))
)

(assert_representable noteq $d3 "u" $d1 "u")