mirror of
https://github.com/moby/moby.git
synced 2026-08-08 09:01:44 +00:00
72 lines
2.3 KiB
Go
72 lines
2.3 KiB
Go
// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Package bsonlite provides a minimal BSON codec for strfmt types.
|
|
//
|
|
// This codec produces BSON output compatible with go.mongodb.org/mongo-driver/v2
|
|
// (v2.5.0). It handles only the exact BSON patterns used by strfmt:
|
|
// single-key {"data": value} documents with string, DateTime, or ObjectID values.
|
|
//
|
|
// This package is intended to provide a backward-compatible API to users of
|
|
// go-openapi/strfmt. It is not intended to be maintained or to follow the
|
|
// evolutions of the official MongoDB drivers. For up-to-date MongoDB support,
|
|
// import "github.com/go-openapi/strfmt/enable/mongodb" to replace this codec
|
|
// with one backed by the real driver.
|
|
package bsonlite
|
|
|
|
import "time"
|
|
|
|
// Codec provides BSON document marshal/unmarshal for strfmt types.
|
|
//
|
|
// MarshalDoc encodes a single-key BSON document {"data": value}.
|
|
// The value must be one of: string, time.Time, or [12]byte (ObjectID).
|
|
//
|
|
// UnmarshalDoc decodes a BSON document and returns the "data" field's value.
|
|
// Returns one of: string, time.Time, or [12]byte depending on the BSON type.
|
|
type Codec interface {
|
|
MarshalDoc(value any) ([]byte, error)
|
|
UnmarshalDoc(data []byte) (any, error)
|
|
}
|
|
|
|
// C is the active BSON codec.
|
|
//
|
|
//nolint:gochecknoglobals // replaceable codec, by design
|
|
var C Codec = liteCodec{}
|
|
|
|
// Replace swaps the active BSON codec with the provided implementation.
|
|
// This is intended to be called from enable/mongodb's init().
|
|
//
|
|
// Since [Replace] affects the global state of the package, it is not intended for concurrent use.
|
|
func Replace(c Codec) {
|
|
C = c
|
|
}
|
|
|
|
// BSON type tags (from the BSON specification).
|
|
const (
|
|
TypeString byte = 0x02
|
|
TypeObjectID byte = 0x07
|
|
TypeDateTime byte = 0x09
|
|
TypeNull byte = 0x0A
|
|
)
|
|
|
|
// ObjectIDSize is the size of a BSON ObjectID in bytes.
|
|
const ObjectIDSize = 12
|
|
|
|
// DateTimeToMillis converts a time.Time to BSON DateTime milliseconds.
|
|
func DateTimeToMillis(t time.Time) int64 {
|
|
const (
|
|
millisec = 1000
|
|
microsec = 1_000_000
|
|
)
|
|
return t.Unix()*millisec + int64(t.Nanosecond())/microsec
|
|
}
|
|
|
|
// MillisToTime converts BSON DateTime milliseconds to time.Time.
|
|
func MillisToTime(millis int64) time.Time {
|
|
const (
|
|
millisec = 1000
|
|
nanosPerMs = 1_000_000
|
|
)
|
|
return time.Unix(millis/millisec, millis%millisec*nanosPerMs)
|
|
}
|