mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			130 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright (c) Faye Amacker. All rights reserved.
 | 
						|
// Licensed under the MIT License. See LICENSE in the project root for license information.
 | 
						|
 | 
						|
/*
 | 
						|
Package cbor is a modern CBOR codec (RFC 8949 & RFC 7049) with CBOR tags,
 | 
						|
Go struct tags (toarray/keyasint/omitempty), Core Deterministic Encoding,
 | 
						|
CTAP2, Canonical CBOR, float64->32->16, and duplicate map key detection.
 | 
						|
 | 
						|
Encoding options allow "preferred serialization" by encoding integers and floats
 | 
						|
to their smallest forms (e.g. float16) when values fit.
 | 
						|
 | 
						|
Struct tags like "keyasint", "toarray" and "omitempty" make CBOR data smaller
 | 
						|
and easier to use with structs.
 | 
						|
 | 
						|
For example, "toarray" tag makes struct fields encode to CBOR array elements.  And
 | 
						|
"keyasint" makes a field encode to an element of CBOR map with specified int key.
 | 
						|
 | 
						|
Latest docs can be viewed at https://github.com/fxamacker/cbor#cbor-library-in-go
 | 
						|
 | 
						|
# Basics
 | 
						|
 | 
						|
The Quick Start guide is at https://github.com/fxamacker/cbor#quick-start
 | 
						|
 | 
						|
Function signatures identical to encoding/json include:
 | 
						|
 | 
						|
	Marshal, Unmarshal, NewEncoder, NewDecoder, (*Encoder).Encode, (*Decoder).Decode.
 | 
						|
 | 
						|
Standard interfaces include:
 | 
						|
 | 
						|
	BinaryMarshaler, BinaryUnmarshaler, Marshaler, and Unmarshaler.
 | 
						|
 | 
						|
Custom encoding and decoding is possible by implementing standard interfaces for
 | 
						|
user-defined Go types.
 | 
						|
 | 
						|
Codec functions are available at package-level (using defaults options) or by
 | 
						|
creating modes from options at runtime.
 | 
						|
 | 
						|
"Mode" in this API means definite way of encoding (EncMode) or decoding (DecMode).
 | 
						|
 | 
						|
EncMode and DecMode interfaces are created from EncOptions or DecOptions structs.
 | 
						|
 | 
						|
	em, err := cbor.EncOptions{...}.EncMode()
 | 
						|
	em, err := cbor.CanonicalEncOptions().EncMode()
 | 
						|
	em, err := cbor.CTAP2EncOptions().EncMode()
 | 
						|
 | 
						|
Modes use immutable options to avoid side-effects and simplify concurrency. Behavior of
 | 
						|
modes won't accidentally change at runtime after they're created.
 | 
						|
 | 
						|
Modes are intended to be reused and are safe for concurrent use.
 | 
						|
 | 
						|
EncMode and DecMode Interfaces
 | 
						|
 | 
						|
	    // EncMode interface uses immutable options and is safe for concurrent use.
 | 
						|
	    type EncMode interface {
 | 
						|
		Marshal(v interface{}) ([]byte, error)
 | 
						|
		NewEncoder(w io.Writer) *Encoder
 | 
						|
		EncOptions() EncOptions  // returns copy of options
 | 
						|
	    }
 | 
						|
 | 
						|
	    // DecMode interface uses immutable options and is safe for concurrent use.
 | 
						|
	    type DecMode interface {
 | 
						|
		Unmarshal(data []byte, v interface{}) error
 | 
						|
		NewDecoder(r io.Reader) *Decoder
 | 
						|
		DecOptions() DecOptions  // returns copy of options
 | 
						|
	    }
 | 
						|
 | 
						|
Using Default Encoding Mode
 | 
						|
 | 
						|
	b, err := cbor.Marshal(v)
 | 
						|
 | 
						|
	encoder := cbor.NewEncoder(w)
 | 
						|
	err = encoder.Encode(v)
 | 
						|
 | 
						|
Using Default Decoding Mode
 | 
						|
 | 
						|
	err := cbor.Unmarshal(b, &v)
 | 
						|
 | 
						|
	decoder := cbor.NewDecoder(r)
 | 
						|
	err = decoder.Decode(&v)
 | 
						|
 | 
						|
Creating and Using Encoding Modes
 | 
						|
 | 
						|
	// Create EncOptions using either struct literal or a function.
 | 
						|
	opts := cbor.CanonicalEncOptions()
 | 
						|
 | 
						|
	// If needed, modify encoding options
 | 
						|
	opts.Time = cbor.TimeUnix
 | 
						|
 | 
						|
	// Create reusable EncMode interface with immutable options, safe for concurrent use.
 | 
						|
	em, err := opts.EncMode()
 | 
						|
 | 
						|
	// Use EncMode like encoding/json, with same function signatures.
 | 
						|
	b, err := em.Marshal(v)
 | 
						|
	// or
 | 
						|
	encoder := em.NewEncoder(w)
 | 
						|
	err := encoder.Encode(v)
 | 
						|
 | 
						|
	// NOTE: Both em.Marshal(v) and encoder.Encode(v) use encoding options
 | 
						|
	// specified during creation of em (encoding mode).
 | 
						|
 | 
						|
# CBOR Options
 | 
						|
 | 
						|
Predefined Encoding Options: https://github.com/fxamacker/cbor#predefined-encoding-options
 | 
						|
 | 
						|
Encoding Options: https://github.com/fxamacker/cbor#encoding-options
 | 
						|
 | 
						|
Decoding Options: https://github.com/fxamacker/cbor#decoding-options
 | 
						|
 | 
						|
# Struct Tags
 | 
						|
 | 
						|
Struct tags like `cbor:"name,omitempty"` and `json:"name,omitempty"` work as expected.
 | 
						|
If both struct tags are specified then `cbor` is used.
 | 
						|
 | 
						|
Struct tags like "keyasint", "toarray", and "omitempty" make it easy to use
 | 
						|
very compact formats like COSE and CWT (CBOR Web Tokens) with structs.
 | 
						|
 | 
						|
For example, "toarray" makes struct fields encode to array elements.  And "keyasint"
 | 
						|
makes struct fields encode to elements of CBOR map with int keys.
 | 
						|
 | 
						|
https://raw.githubusercontent.com/fxamacker/images/master/cbor/v2.0.0/cbor_easy_api.png
 | 
						|
 | 
						|
Struct tags are listed at https://github.com/fxamacker/cbor#struct-tags-1
 | 
						|
 | 
						|
# Tests and Fuzzing
 | 
						|
 | 
						|
Over 375 tests are included in this package. Cover-guided fuzzing is handled by
 | 
						|
a private fuzzer that replaced fxamacker/cbor-fuzz years ago.
 | 
						|
*/
 | 
						|
package cbor
 |