Skip to content

mus-format/dts-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dts-go

Go Reference GoReportCard codecov

dts-go provides DTM support for the mus-go serializer (DTS stands for Data Type metadata Support).

dts-go is particularly useful when deserializing data with an unpredictable type. This could include completely different types, such as Foo and Bar, or different versions of the same data, such as FooV1 and FooV2.

It encodes a DTM (which is simply a number) along with the data itself, allowing one type to be easily distinguished from another. Let’s see how:

package main

import (
  "math/rand"

  com "github.com/mus-format/common-go"
  dts "github.com/mus-format/dts-go"
  "github.com/mus-format/mus-go"
)
  
type Foo struct{...}
type Bar struct{..}

// DTM (Data Type Metadata) definitions.
const (
  FooDTM com.DTM = iota + 1
  BarDTM
)

// Serializers.
var (
  FooMUS = ...
  BarMUS = ...
)

// DTS (Data Type metadata Support) definitions.
var (
  FooDTS = dts.New[Foo](FooDTM, FooMUS)
  BarDTS = dts.New[Bar](BarDTM, BarMUS)
)

func main() {
  // Make a random data and Unmarshal DTM.
  bs := randomData()
  dtm, n, err := dts.DTMSer.Unmarshal(bs)
  if err != nil {
    panic(err)
  }

  // Deserialize and process data depending on the DTM.
  switch dtm {
  case FooDTM:
    foo, _, err := FooDTS.UnmarshalData(bs[n:])
    if err != nil {
      panic(err)
    }
    // process foo ...
    fmt.Println(foo)
  case BarDTM:
    bar, _, err := BarDTS.UnmarshalData(bs[n:])
    if err != nil {
      panic(err)
    }
    // process bar ...
    fmt.Println(bar)
  default:
    panic(fmt.Sprintf("unexpected %v DTM", dtm))
  }
}
}

func randomData() (bs []byte) {...}

A full example can be found at examples-go

About

Provides DTM support for the mus-go serializer

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages