-
Notifications
You must be signed in to change notification settings - Fork 18
/
support.go
74 lines (59 loc) · 1.81 KB
/
support.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and Open Component Model contributors.
//
// SPDX-License-Identifier: Apache-2.0
package scheme
import (
"reflect"
"github.com/open-component-model/ocm/pkg/errors"
"github.com/open-component-model/ocm/pkg/runtime"
)
type Converter[O Object] interface {
ConvertTo(Object) (O, error)
ConvertFrom(O) (Object, error)
}
type runtimeConverterAdapter[O Object] struct {
converter Converter[O]
}
func (c *runtimeConverterAdapter[O]) ConvertTo(object interface{}) (runtime.TypedObject, error) {
return c.converter.ConvertTo(object.(Object))
}
type defaultType[O Object] struct {
decoder *runtime.ConvertingDecoder
converter Converter[O]
}
func NewTypeByProtoType[O Object](proto Object, converter Converter[O]) Type[O] {
return &defaultType[O]{
decoder: runtime.MustNewConvertingDecoder(proto, &runtimeConverterAdapter[O]{converter}),
converter: converter,
}
}
func (t *defaultType[O]) Decode(data []byte, unmarshaler runtime.Unmarshaler) (O, error) {
var zero O
o, err := t.decoder.Decode(data, unmarshaler)
if err != nil {
return zero, err
}
return o.(O), nil
}
func (t *defaultType[O]) Encode(o O, m runtime.Marshaler) ([]byte, error) {
c, err := t.converter.ConvertFrom(o)
if err != nil {
return nil, err
}
return m.Marshal(c)
}
////////////////////////////////////////////////////////////////////////////////
type IdentityConverter[O Object] struct{}
func (c IdentityConverter[O]) ConvertFrom(o O) (Object, error) {
return o, nil
}
func (c IdentityConverter[O]) ConvertTo(o Object) (O, error) {
var zero O
if s, ok := o.(O); ok {
return s, nil
}
return zero, errors.ErrInvalid("raw type", reflect.TypeOf(o).String())
}
func NewIdentityType[O Object](proto O) Type[O] {
return NewTypeByProtoType[O](proto, IdentityConverter[O]{})
}