types

package module
v0.0.0-...-50a3a2f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 8, 2024 License: Apache-2.0 Imports: 14 Imported by: 38

README

types

This repository contains the types that are used for various generic types within the ThingsIX project and some generic functions to handle them

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AccountRewardHistory

type AccountRewardHistory struct {
	// The acount this reward history is for
	Account common.Address `json:"account"`

	// The reward in THIX "gweis" for this account at this moment
	Rewards *big.Int `json:"rewards"`

	// The sum of rewards ever received uptil now
	TotalRewards *big.Int `json:"totalRewards"`

	// The processor that can process the cheque for the total rewards
	Processor common.Address `json:"processor"`

	// The signature by the cheque creator that can be used to claim the rewards
	Signature hexutil.Bytes `json:"signature"`

	// Date these rewards where issued
	Date time.Time `json:"date"`
}

func (AccountRewardHistory) MarshalJSON

func (arh AccountRewardHistory) MarshalJSON() ([]byte, error)

type AssumedCoverageHistory

type AssumedCoverageHistory struct {
	// Res 8 cell of the location of the coverage
	Location h3light.Cell `json:"location"`

	// The coverage as being provided by one or multiple gateways
	GatewayCoverage []*AssumedGatewayCoverageHistory `json:"gatewayCoverage"`

	// Date this coverage was (assumed to be) present based on the measurements
	Date time.Time `json:"date"`
}

AssumedCoverageHistory stores the history (and therefore also current coverage) as assumed based in calculated coverage As not every location can be mapped, based on the actually mapped locations, a assumed coverage is calculated There can be multiple AssumedCoverageHistory's for the same location for different gateways.

type AssumedGatewayCoverageHistory

type AssumedGatewayCoverageHistory struct {

	// ID of the gateway that provides this coverage
	GatewayID ID `json:"gatewayId"`

	// The number of (res10) coverage records this gateway actually has within this (res8) cell
	NumCoverage uint64 `json:"numCoverage"`

	// The share of total all coverage records this gateway in this res8 cell, all shares for different gateways together must be 1000.
	Share uint64 `json:"share"`
}

type AssumedUnverifiedCoverage

type AssumedUnverifiedCoverage struct {
	// Res 8 cell of the location of the coverage
	Location h3light.Cell `json:"location"`

	LatestUpdate time.Time `json:"latestUpdate"`
}

type CoverageHistory

type CoverageHistory struct {
	// Res 10 cell of the location of the coverage
	Location h3light.Cell `json:"location"`

	// Date this coverage was (assumed to be) present based on the measurements
	Date time.Time `json:"date"`
	// ID of the gateway that provides this coverage
	GatewayID ID `json:"gatewayId"`

	// The location of the gateway that provides this coverage
	GatewayLocation h3light.Cell `json:"gatewayLocation"`

	// The frequency plan that coverage is provided for
	FrequencyPlan frequency_plan.BandName `json:"frequencyPlan"`

	// ID of the mapper that mapped this coverage
	MapperID ID `json:"mapperId"`

	// ID of the mapping record that was used to base this coverage on
	MappingID ID `json:"mappingId"`

	// Time of the mapping record that was used to base this coverage on
	MappingTime time.Time `json:"mappingTime"`

	// The RSSI (signal strength) of coverage at this location
	RSSI int `json:"rssi"`
}

CoverageHistory stores the history (and therefore also current coverage) provided by the network

type FrequencyPlan

type FrequencyPlan struct {
	ID   uint8  `json:"id"`
	Plan string `json:"plan"`
}

type Gateway

type Gateway struct {
	// ID is the ThingsIX compressed public key for this gateway
	ID              ID                       `json:"id" gorm:"primaryKey;type:bytea"`
	ContractAddress common.Address           `json:"contract"`
	Version         uint8                    `json:"version"`
	Owner           common.Address           `json:"owner" gorm:"index;type:bytea"`
	AntennaGain     *float32                 `json:"antennaGain,omitempty"`
	FrequencyPlan   *frequency_plan.BandName `json:"frequencyPlan,omitempty"`
	Location        *h3light.Cell            `json:"location,omitempty"`
	Altitude        *uint                    `json:"altitude,omitempty"`
}

type GatewayEvent

type GatewayEvent struct {
	ContractAddress  common.Address `json:"contract"`
	Block            common.Hash    `json:"blockHash"`
	Transaction      common.Hash    `json:"transaction"`
	BlockNumber      uint64         `json:"blockNumber"`
	TransactionIndex uint           `json:"transactionIndex"`
	LogIndex         uint           `json:"logIndex"`
	Time             time.Time      `json:"time"`

	Type             GatewayEventType         `json:"type"`
	ID               ID                       `json:"id"`
	Version          uint8                    `json:"version"`
	NewOwner         *common.Address          `json:"newOwner"`
	OldOwner         *common.Address          `json:"oldOwner"`
	NewLocation      *h3light.Cell            `json:"newLocation,omitempty"`
	OldLocation      *h3light.Cell            `json:"oldLocation,omitempty"`
	NewAltitude      *uint                    `json:"newAltitude,omitempty"`
	OldAltitude      *uint                    `json:"oldAltitude,omitempty"`
	NewFrequencyPlan *frequency_plan.BandName `json:"newFrequencyPlan,omitempty"`
	OldFrequencyPlan *frequency_plan.BandName `json:"oldFrequencyPlan,omitempty"`
	NewAntennaGain   *float32                 `json:"newAntennaGain,omitempty"`
	OldAntennaGain   *float32                 `json:"oldAntennaGain,omitempty"`
}

GatewayEvent represents a log emitted by the gateway registry that is related to a gateway.

type GatewayEventType

type GatewayEventType string
const (
	GatewayOnboardedEvent   GatewayEventType = "onboard"
	GatewayOffboardedEvent  GatewayEventType = "offboard"
	GatewayUpdatedEvent     GatewayEventType = "update"
	GatewayTransferredEvent GatewayEventType = "transfer"
	GatewayUnknownEvent     GatewayEventType = "unknown"
)

func (GatewayEventType) MarshalText

func (event GatewayEventType) MarshalText() ([]byte, error)

func (*GatewayEventType) Scan

func (event *GatewayEventType) Scan(value interface{}) error

func (*GatewayEventType) UnmarshalText

func (event *GatewayEventType) UnmarshalText(input []byte) error

type GatewayHistory

type GatewayHistory struct {
	ContractAddress common.Address `json:"contract"`
	Block           common.Hash    `json:"blockHash"`
	Transaction     common.Hash    `json:"transaction"`
	BlockNumber     uint64         `json:"blockNumber"`
	Time            time.Time      `json:"time"`

	ID            ID                       `json:"id"`
	Version       uint8                    `json:"version"`
	Owner         *common.Address          `json:"owner"`
	AntennaGain   *float32                 `json:"antennaGain,omitempty"`
	FrequencyPlan *frequency_plan.BandName `json:"frequencyPlan,omitempty"`
	Location      *h3light.Cell            `json:"location,omitempty"`
	Altitude      *uint                    `json:"altitude,omitempty"`
}

func (*GatewayHistory) Gateway

func (gh *GatewayHistory) Gateway() *Gateway

type GatewayRewardHistory

type GatewayRewardHistory struct {

	// ID of the gateway
	GatewayID ID `json:"gatewayId"`

	// Date these rewards where issued
	Date time.Time `json:"date"`

	// The total amount of Coverage Share Units this gateway has a the date.
	AssumedCoverageShareUnits *big.Int `json:"assumedCoverageUnits"`

	// The reward in THIX "gweis" for this gateway
	Rewards *big.Int `json:"rewards"`
}

GatewayRewardHistory stores the historical data of rewards as received by a gateway

func (GatewayRewardHistory) MarshalJSON

func (grh GatewayRewardHistory) MarshalJSON() ([]byte, error)

type ID

type ID [32]byte

func IDFromBytes

func IDFromBytes(b []byte) ID

func IDFromPublicKeyBytes

func IDFromPublicKeyBytes(publicKeyBytes []byte) ID

func IDFromRandom

func IDFromRandom() ID

func IDFromString

func IDFromString(s string) ID

func (ID) MarshalText

func (id ID) MarshalText() ([]byte, error)

func (ID) String

func (id ID) String() string

func (*ID) UnmarshalText

func (id *ID) UnmarshalText(input []byte) error

type Mapper

type Mapper struct {
	ID              ID                      `json:"id"`
	ContractAddress common.Address          `json:"contract"`
	Revision        uint16                  `json:"revision"`
	Owner           *common.Address         `json:"owner"`
	FrequencyPlan   frequency_plan.BandName `json:"frequencyPlan"`
	Active          bool                    `json:"active"`
}

type MapperEvent

type MapperEvent struct {
	ContractAddress  common.Address `json:"contract"`
	Block            common.Hash    `json:"blockHash"`
	Transaction      common.Hash    `json:"transaction"`
	BlockNumber      uint64         `json:"blockNumber"`
	TransactionIndex uint           `json:"transactionIndex"`
	LogIndex         uint           `json:"logIndex"`

	Type          MapperEventType         `json:"type"`
	ID            ID                      `json:"id"`
	Revision      uint16                  `json:"revision"`
	FrequencyPlan frequency_plan.BandName `json:"frequencyPlan"`
	NewOwner      *common.Address         `json:"newOwner"`
	OldOwner      *common.Address         `json:"oldOwner"`
	Time          time.Time               `json:"time"`
}

type MapperEventType

type MapperEventType string
const (
	// RegisterEvent is raised when a mapper is registered registry by ThingsIX
	MapperRegisteredEvent MapperEventType = "register"
	// OnboardEvent is raised when a mapper is onboarded by its owner
	MapperOnboardedEvent MapperEventType = "onboard"
	// ClaimEvent is raised when a mapper is claimed by ThingsIX
	MapperClaimedEvent MapperEventType = "claim"
	// RemovedEvent is raised when a mapper is removed from the registry
	MapperRemovedEvent MapperEventType = "removed"
	// MapperDeactivated is raised when ThingsIX marks a mapper as inactive
	MapperDeactivated MapperEventType = "deactivated"
	// MapperActive is raised when ThingsIX marks a mapper as active
	MapperActivated MapperEventType = "activated"
	// MapperTransfer is raised when the mapper is transferred to a different owner
	MapperTransfered                   = "transfer"
	MapperUnknownEvent MapperEventType = "unknown"
)

func (MapperEventType) MarshalText

func (event MapperEventType) MarshalText() ([]byte, error)

func (*MapperEventType) Scan

func (event *MapperEventType) Scan(value interface{}) error

func (*MapperEventType) UnmarshalText

func (event *MapperEventType) UnmarshalText(input []byte) error

func (MapperEventType) Value

func (event MapperEventType) Value() (driver.Value, error)

type MapperHistory

type MapperHistory struct {
	ContractAddress common.Address `json:"contract"`
	Block           common.Hash    `json:"blockHash"`
	Transaction     common.Hash    `json:"transaction"`
	BlockNumber     uint64         `json:"blockNumber"`
	Time            time.Time      `json:"time"`

	ID            ID                      `json:"id"`
	Revision      uint16                  `json:"revision"`
	Owner         *common.Address         `json:"owner"`
	FrequencyPlan frequency_plan.BandName `json:"frequencyPlan"`
	Active        bool                    `json:"active"`
}

func (*MapperHistory) Mapper

func (mh *MapperHistory) Mapper() *Mapper

type MapperRewardHistory

type MapperRewardHistory struct {

	// ID of the mapper
	MapperID ID `json:"mapperId"`

	// Date these rewards where issued
	Date time.Time `json:"date"`

	// The total amount of MappingUnits the mapper got rewards for
	MappingUnits *big.Int `json:"mappingUnits"`

	// The reward in THIX "gweis" for this mapper
	Rewards *big.Int `json:"rewards"`
}

MapperRewardHistory stores the historical data of rewards as received by a mapper

func (MapperRewardHistory) MarshalJSON

func (mrh MapperRewardHistory) MarshalJSON() ([]byte, error)

type MappingDiscoveryReceiptRecord

type MappingDiscoveryReceiptRecord struct {
	Frequency         uint32                  `json:"frequency,omitempty"`
	Rssi              int32                   `json:"rssi,omitempty"`
	Snr               float64                 `json:"snr,omitempty"`
	SpreadingFactor   uint32                  `json:"spreadingFactor,omitempty"`
	Bandwidth         uint32                  `json:"bandwidth,omitempty"`
	CodeRate          string                  `json:"codeRate,omitempty"`
	Phy               []byte                  `json:"phy,omitempty"`
	ReceivedTime      time.Time               `json:"receivedTime,omitempty"`
	GatewayTime       time.Time               `json:"gatewayTime,omitempty"`
	GatewaySignature  []byte                  `json:"gatewaySignature,omitempty"`
	GatewayID         ID                      `json:"gatewayId,omitempty"`
	GatewayLocation   *h3light.Cell           `json:"gatewayLocation,omitempty"`
	MapperID          ID                      `json:"mapperId,omitempty"`
	ServiceValidation MappingRecordValidation `json:"serviceValidation"`
}

func (*MappingDiscoveryReceiptRecord) MappingID

func (mdrr *MappingDiscoveryReceiptRecord) MappingID() ID

Return the

type MappingDownlinkReceiptRecord

type MappingDownlinkReceiptRecord struct {
	Frequency         uint32                  `json:"frequency,omitempty"`
	Rssi              int32                   `json:"rssi,omitempty"`
	Snr               float64                 `json:"snr,omitempty"`
	SpreadingFactor   uint32                  `json:"spreadingFactor,omitempty"`
	Bandwidth         uint32                  `json:"bandwidth,omitempty"`
	CodeRate          string                  `json:"codeRate,omitempty"`
	Phy               []byte                  `json:"phy,omitempty"`
	ReceivedTime      time.Time               `json:"receivedTime,omitempty"`
	GatewayTime       time.Time               `json:"gatewayTime,omitempty"`
	GatewaySignature  []byte                  `json:"gatewaySignature,omitempty"`
	GatewayID         ID                      `json:"gatewayId,omitempty"`
	MapperID          ID                      `json:"mapperId,omitempty"`
	ServiceValidation MappingRecordValidation `json:"serviceValidation"`
}

type MappingRecord

type MappingRecord struct {
	ID                        ID                               `json:"id"`
	DiscoveryReceiptRecords   []*MappingDiscoveryReceiptRecord `json:"discoveryReceiptRecords"`
	DiscoveryPhy              []byte                           `json:"discoveryPhy"`
	DownlinkReceiptRecords    []*MappingDownlinkReceiptRecord  `json:"downlinkReceiptRecords"`
	DownlinkPhy               []byte                           `json:"downlinkPhy"`
	MeasuredRssi              *int                             `json:"measuredRssi"`
	MeasuredSnr               *int                             `json:"measuredSnr"`
	FrequencyPlan             frequency_plan.BandName          `json:"frequencyPlan"`
	ChallengedGatewayID       *ID                              `json:"challengedGatewayId"`
	ChallengedGatewayLocation *h3light.Cell                    `json:"challengedGatewayLocation"`
	ChallengedTime            *time.Time                       `json:"challengedTime"`
	MapperID                  ID                               `json:"mapperId"`
	MapperLocation            h3light.Cell                     `json:"mapperLocation"`
	MapperLat                 float64                          `json:"mapperLat"`
	MapperLon                 float64                          `json:"mapperLon"`
	MapperHeight              float64                          `json:"mapperHeight"`
	MapperOsnmaAge            uint8                            `json:"mapperOsnmaAge"`
	MapperSpoofing            uint8                            `json:"mapperSpoofing"`
	MapperTow                 uint32                           `json:"mapperTow"`
	MapperBattery             uint8                            `json:"mapperBattery"`
	MapperVersion             uint8                            `json:"mapperVersion"`
	MapperStatus              uint8                            `json:"mapperStatus"`
	ReceivedTime              time.Time                        `json:"receivedTime"`
	ServiceValidation         MappingRecordValidation          `json:"serviceValidation"`
}

func (*MappingRecord) MappingID

func (mr *MappingRecord) MappingID() ID

Return the MappingID of this MappingRecord, on the

type MappingRecordValidation

type MappingRecordValidation string
const (
	// All validations succeeded, note that later validations can still fail
	MappingRecordValidationOk MappingRecordValidation = "ok"

	// No discovery receipt was received
	MappingRecordValidationNoDiscoveryReceipt MappingRecordValidation = "no-discovery-receipt"

	// No downlink was transmitted (in time)
	MappingRecordValidationNoDownlink MappingRecordValidation = "no-downlink"

	// No downlink receipt was received (in time)
	MappingRecordValidationNoDownlinkReceipt MappingRecordValidation = "no-downlink-receipt"

	// The receipt was received on a wrong channel/frequency
	MappingRecordValidationWrongFrequency MappingRecordValidation = "wrong-frequency"

	// The receipt was received with a wrong spreading factor
	MappingRecordValidationWrongSpreadingFactor MappingRecordValidation = "wrong-spreading-factor"

	// There was a mismatch between the frequency-plan and the location of the mapper and/or of the receiving gateway
	MappingRecordValidationWrongFrequencyPlan MappingRecordValidation = "wrong-frequency-plan"

	// The distance between the mapper and the receiving is too large
	MappingRecordValidationTooLargeDistance MappingRecordValidation = "too-large-distance"

	// The RSSI and/or SNR are unlikely for the distance between the mapper and the receiving gateway
	MappingRecordValidationUnlikelyRssiSnr MappingRecordValidation = "unlikely-rssi-snr"

	// The RSSI is out of the acceptable bounds (too high or too low)
	MappingRecordValidationRssiOutOfBounds MappingRecordValidation = "rssi-out-of-bounds"

	// The receiving gateway is (temporarily) denylisted due to previous suspicious mapping-values
	MappingRecordValidationGatewayDenylisted MappingRecordValidation = "gateway-denylisted"

	// The receiving gateway is blocklisted due to previous suspicious mapping-values
	MappingRecordValidationGatewayBlocklisted MappingRecordValidation = "gateway-blocklisted"

	// The mpper is (temporarily) denylisted due to previous suspicious mapping-values
	MappingRecordValidationMapperTemporarilyDenylisted MappingRecordValidation = "mapper-temp-denylisted"

	// The mapper is blocklisted due to previous suspicious mapping-values
	MappingRecordValidationMapperBlocklisted MappingRecordValidation = "mapper-blocklisted"

	// The mapper is blocklisted due to previous suspicious mapping-values
	MappingRecordValidationMapperNotActive MappingRecordValidation = "mapper-not-active"

	// The mapper record was too old once it was received and delivered to the service
	MappingRecordValidationTooOld MappingRecordValidation = "too-old"

	// The location of the mapper or receiving gateway was invalid
	MappingRecordValidationInvalidLocation MappingRecordValidation = "invalid-location"

	// The location of the mapper was too high or low with respect to the earth surface
	MappingRecordValidationInvalidHeight MappingRecordValidation = "invalid-height"

	// The GPS-security validation by the mapper was invalid
	MappingRecordValidationInvalidGpsSecurity MappingRecordValidation = "invalid-gps-security"

	// The OSNMA validation by the mapper was not sufficient
	MappingRecordValidationInsufficientGpsSecurity MappingRecordValidation = "insufficient-gps-security"

	// An internal server error occcured during validation
	MappingRecordValidationInternalServerError MappingRecordValidation = "internal-server-error"
)

type RewardHistory

type RewardHistory struct {
	// Date these rewards where issued
	Date time.Time `json:"date"`

	// The total amount of Coverage Share Units issued
	TotalAssumedCoverageShareUnits *big.Int `json:"totalAssumedCoverageUnits"`

	// The total amount of MappingUnits the mapper got rewards for
	TotalMappingUnits *big.Int `json:"totalMappingUnits"`

	// The total rewards issued in THIX "gweis"
	TotalRewards *big.Int `json:"totalRewards"`
}

type Router

type Router struct {
	ID              ID                      `json:"id"`
	ContractAddress common.Address          `json:"contract"`
	Owner           common.Address          `json:"owner"`
	NetID           uint32                  `json:"netid"`
	Prefix          uint32                  `json:"prefix"`
	Mask            uint8                   `json:"mask"`
	FrequencyPlan   frequency_plan.BandName `json:"frequencyPlan"`
	Endpoint        string                  `json:"endpoint"`
}

type RouterEvent

type RouterEvent struct {
	ContractAddress  common.Address `json:"contract"`
	Block            common.Hash    `json:"blockHash"`
	Transaction      common.Hash    `json:"transaction"`
	BlockNumber      uint64         `json:"blockNumber"`
	TransactionIndex uint           `json:"transactionIndex"`
	LogIndex         uint           `json:"logIndex"`
	Time             time.Time      `json:"time"`

	Type             RouterEventType          `json:"type"`
	ID               ID                       `json:"id"`
	Owner            *common.Address          `json:"owner"`
	NewNetID         *uint32                  `json:"newNetid"`
	OldNetID         *uint32                  `json:"oldNetid"`
	NewPrefix        *uint32                  `json:"newPrefix"`
	OldPrefix        *uint32                  `json:"oldPrefix"`
	NewMask          *uint8                   `json:"newMask"`
	OldMask          *uint8                   `json:"oldMask"`
	NewFrequencyPlan *frequency_plan.BandName `json:"newFrequencyPlan"`
	OldFrequencyPlan *frequency_plan.BandName `json:"oldFrequencyPlan"`
	NewEndpoint      *string                  `json:"newEndpoint"`
	OldEndpoint      *string                  `json:"oldEndpoint"`
}

type RouterEventType

type RouterEventType string
const (
	// RouterRegisteredEvent is raised when a router is registered by its manager
	RouterRegisteredEvent RouterEventType = "register"
	// RegisterEvent is raised when a router details are updated
	RouterUpdatedEvent RouterEventType = "update"
	// RouterRemovedEvent is raised when router details are removed
	RouterRemovedEvent RouterEventType = "removed"

	RouterUnknownEvent RouterEventType = "unknown"
)

func (RouterEventType) MarshalText

func (event RouterEventType) MarshalText() ([]byte, error)

func (*RouterEventType) Scan

func (event *RouterEventType) Scan(value interface{}) error

func (*RouterEventType) UnmarshalText

func (event *RouterEventType) UnmarshalText(input []byte) error

func (RouterEventType) Value

func (event RouterEventType) Value() (driver.Value, error)

type RouterHistory

type RouterHistory struct {
	ContractAddress common.Address `json:"contract"`
	Block           common.Hash    `json:"blockHash"`
	Transaction     common.Hash    `json:"transaction"`
	BlockNumber     uint64         `json:"blockNumber"`
	Time            time.Time      `json:"time"`

	ID            ID                      `json:"id" gorm:"primaryKey;type:bytea"`
	Owner         *common.Address         `json:"owner"`
	NetID         uint32                  `json:"netid"`
	Prefix        uint32                  `json:"prefix"`
	Mask          uint8                   `json:"mask"`
	FrequencyPlan frequency_plan.BandName `json:"frequencyPlan"`
	Endpoint      string                  `json:"endpoint"`
}

func (*RouterHistory) Router

func (rh *RouterHistory) Router() *Router

type UnverifiedMappingGatewayRecord

type UnverifiedMappingGatewayRecord struct {
	MappingID       ID            `json:"mappingId"`
	GatewayID       ID            `json:"gatewayId,omitempty"`
	GatewayLocation *h3light.Cell `json:"gatewayLocation,omitempty"`
	GatewayTime     time.Time     `json:"gatewayTime,omitempty"`
	Rssi            int32         `json:"rssi,omitempty"`
	Snr             float64       `json:"snr,omitempty"`
}

type UnverifiedMappingRecord

type UnverifiedMappingRecord struct {
	ID                  ID                                `json:"id"`
	GatewayRecords      []*UnverifiedMappingGatewayRecord `json:"gatewayRecords"`
	MapperID            string                            `json:"mapperId"`
	BestGatewayID       *ID                               `json:"bestGatewayId"`
	BestGatewayLocation *h3light.Cell                     `json:"bestGatewayLocation"`
	BestGatewayRssi     *int32                            `json:"bestGatewayRssi"`
	BestGatewaySnr      *float64                          `json:"bestGatewaySnr"`
	MapperLocation      h3light.Cell                      `json:"mapperLocation"`
	MapperLat           float64                           `json:"mapperLat"`
	MapperLon           float64                           `json:"mapperLon"`
	MapperAccuracy      float64                           `json:"mapperAccuracy"`
	MapperHeight        float64                           `json:"mapperHeight"`
	ReceivedTime        time.Time                         `json:"receivedTime"`
	Frequency           uint32                            `json:"frequency,omitempty"`
	SpreadingFactor     uint32                            `json:"spreadingFactor,omitempty"`
	Bandwidth           uint32                            `json:"bandwidth,omitempty"`
	CodeRate            string                            `json:"codeRate,omitempty"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL