github.com/anthropics/anthropic-sdk-go@v1.70.1/packages/respjson/respjson.go (about)

     1  package respjson
     2  
     3  // A Field provides metadata to indicate the presence of a value.
     4  //
     5  // Use [Field.Valid] to check if an optional value was null or omitted.
     6  //
     7  // A Field will always occur in the following structure, where it
     8  // mirrors the original field in its parent struct:
     9  //
    10  //	type ExampleObject struct {
    11  //		Foo bool	`json:"foo"`
    12  //		Bar int		`json:"bar"`
    13  //		// ...
    14  //
    15  //		// JSON provides metadata about the object.
    16  //		JSON struct {
    17  //			Foo Field
    18  //			Bar Field
    19  //			// ...
    20  //		} `json:"-"`
    21  //	}
    22  //
    23  // To differentiate a "nullish" value from the zero value,
    24  // use the [Field.Valid] method.
    25  //
    26  //	if !example.JSON.Foo.Valid() {
    27  //		println("Foo is null or omitted")
    28  //	}
    29  //
    30  //	if example.Foo {
    31  //		println("Foo is true")
    32  //	} else {
    33  //		println("Foo is false")
    34  //	}
    35  //
    36  // To differentiate if a field was omitted or the JSON value "null",
    37  // use the [Field.Raw] method.
    38  //
    39  //	if example.JSON.Foo.Raw() == "null" {
    40  //		println("Foo is null")
    41  //	}
    42  //
    43  //	if example.JSON.Foo.Raw() == "" {
    44  //		println("Foo was omitted")
    45  //	}
    46  //
    47  // Otherwise, if the field was invalid and couldn't be marshalled successfully,
    48  // [Field.Valid] will be false and [Field.Raw] will not be empty.
    49  type Field struct {
    50  	status
    51  	raw string
    52  }
    53  
    54  const (
    55  	omitted status = iota
    56  	null
    57  	invalid
    58  	valid
    59  )
    60  
    61  type status int8
    62  
    63  // Valid returns true if the parent field was set.
    64  // Valid returns false if the value doesn't exist, is JSON null, or
    65  // is an unexpected type.
    66  func (j Field) Valid() bool { return j.status > invalid }
    67  
    68  const Null string = "null"
    69  const Omitted string = ""
    70  
    71  // Returns the raw JSON value of the field.
    72  func (j Field) Raw() string {
    73  	if j.status == omitted {
    74  		return ""
    75  	}
    76  	return j.raw
    77  }
    78  
    79  func NewField(raw string) Field {
    80  	if raw == "null" {
    81  		return Field{status: null, raw: Null}
    82  	}
    83  	return Field{status: valid, raw: raw}
    84  }
    85  
    86  func NewInvalidField(raw string) Field {
    87  	return Field{status: invalid, raw: raw}
    88  }