Skip to content
/ valast Public

Convert Go values to their AST

License

Unknown and 2 other licenses found

Licenses found

Unknown
LICENSE
Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

hexops/valast

Folders and files

NameName
Last commit message
Last commit date
Dec 20, 2022
Feb 19, 2025
Aug 8, 2023
Jan 12, 2021
Dec 25, 2020
Dec 25, 2020
Feb 19, 2025
Feb 18, 2021
Jan 3, 2021
Aug 8, 2023
Aug 8, 2023
Feb 18, 2021
Aug 8, 2023
Feb 19, 2025
Feb 19, 2025
Feb 18, 2021
Feb 19, 2025
Aug 8, 2023

valast - convert Go values to their AST Hexops logo

Go Reference

Go CI codecov Go Report Card

Valast converts Go values at runtime into their go/ast equivalent, e.g.:

x := &foo.Bar{
    a: "hello world!",
    B: 1.234,
}
fmt.Println(valast.String(x))

Prints string:

&foo.Bar{a: "hello world!", B: 1.234}

What is this useful for?

This can be useful for debugging and testing, you may think of it as a more comprehensive and configurable version of the fmt package's %+v and %#v formatting directives. It is similar to e.g. repr in Python.

Features

  • Produces Go code via a go/ast, defers formatting to the best-in-class Go formatter gofumpt.
  • Fully handles unexported fields, types, and values (optional.)
  • Strong emphasis on being used for producing valid Go code that can be copy & pasted directly into e.g. tests.
  • Extensively tested, over 88 tests and handling numerous edge cases (such as pointers to unaddressable literal values like &"foo" properly, and even finding bugs in alternative packages').
  • Provide custom AST representations for your types with valast.RegisterType(...).

Alternatives comparison

The following are alternatives to Valast, making note of the differences we found that let us to create Valast:

You may also wish to look at autogold and go-cmp, which aim to solve the "compare Go values in a test" problem.