1 // Copyright 2022 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build !go1.21 6 7 package slog 8 9 import ( 10 "time" 11 12 "golang.org/x/exp/slog" 13 ) 14 15 // A Value can represent any Go value, but unlike type any, 16 // it can represent most small values without an allocation. 17 // The zero Value corresponds to nil. 18 type Value = slog.Value 19 20 // Kind is the kind of a Value. 21 type Kind = slog.Kind 22 23 // The following list is sorted alphabetically, but it's also important that 24 // KindAny is 0 so that a zero Value represents nil. 25 const ( 26 KindAny = slog.KindAny 27 KindBool = slog.KindBool 28 KindDuration = slog.KindDuration 29 KindFloat64 = slog.KindFloat64 30 KindInt64 = slog.KindInt64 31 KindString = slog.KindString 32 KindTime = slog.KindTime 33 KindUint64 = slog.KindUint64 34 KindGroup = slog.KindGroup 35 KindLogValuer = slog.KindLogValuer 36 ) 37 38 //////////////// Constructors 39 40 // StringValue returns a new Value for a string. 41 func StringValue(value string) Value { 42 return slog.StringValue(value) 43 } 44 45 // IntValue returns a Value for an int. 46 func IntValue(v int) Value { 47 return slog.IntValue(v) 48 } 49 50 // Int64Value returns a Value for an int64. 51 func Int64Value(v int64) Value { 52 return slog.Int64Value(v) 53 } 54 55 // Uint64Value returns a Value for a uint64. 56 func Uint64Value(v uint64) Value { 57 return slog.Uint64Value(v) 58 } 59 60 // Float64Value returns a Value for a floating-point number. 61 func Float64Value(v float64) Value { 62 return slog.Float64Value(v) 63 } 64 65 // BoolValue returns a Value for a bool. 66 func BoolValue(v bool) Value { 67 return slog.BoolValue(v) 68 } 69 70 // TimeValue returns a Value for a time.Time. 71 // It discards the monotonic portion. 72 func TimeValue(v time.Time) Value { 73 return slog.TimeValue(v) 74 } 75 76 // DurationValue returns a Value for a time.Duration. 77 func DurationValue(v time.Duration) Value { 78 return slog.DurationValue(v) 79 } 80 81 // GroupValue returns a new Value for a list of Attrs. 82 // The caller must not subsequently mutate the argument slice. 83 func GroupValue(as ...Attr) Value { 84 return slog.GroupValue(as...) 85 } 86 87 // AnyValue returns a Value for the supplied value. 88 // 89 // If the supplied value is of type Value, it is returned 90 // unmodified. 91 // 92 // Given a value of one of Go's predeclared string, bool, or 93 // (non-complex) numeric types, AnyValue returns a Value of kind 94 // String, Bool, Uint64, Int64, or Float64. The width of the 95 // original numeric type is not preserved. 96 // 97 // Given a time.Time or time.Duration value, AnyValue returns a Value of kind 98 // KindTime or KindDuration. The monotonic time is not preserved. 99 // 100 // For nil, or values of all other types, including named types whose 101 // underlying type is numeric, AnyValue returns a value of kind KindAny. 102 func AnyValue(v any) Value { 103 return slog.AnyValue(v) 104 } 105 106 // A LogValuer is any Go value that can convert itself into a Value for logging. 107 // 108 // This mechanism may be used to defer expensive operations until they are 109 // needed, or to expand a single value into a sequence of components. 110 type LogValuer = slog.LogValuer 111