Skip to content
This repository has been archived by the owner on Nov 18, 2021. It is now read-only.

Commit

Permalink
encoding/protobuf/textproto: add decoder implementation
Browse files Browse the repository at this point in the history
Note that this is incredibly buggy. Not much I can do,
as there just doesn't seem to be any good textproto parser
for Go, and this one is the recommended "gold standard".

Issue #5

Change-Id: Ieab0910dc4ea6072d9dc50e2947d8a7fb33ba7ef
  • Loading branch information
mpvl committed Apr 15, 2021
1 parent dd87bfd commit c028026
Show file tree
Hide file tree
Showing 14 changed files with 1,031 additions and 4 deletions.
142 changes: 142 additions & 0 deletions encoding/protobuf/pbinternal/attribute.go
@@ -0,0 +1,142 @@
// Copyright 2021 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package pbinternal

import (
"strings"

"cuelang.org/go/cue"
)

type CompositeType int

const (
Normal CompositeType = iota
List
Map
)

type ValueType int

const (
Unknown ValueType = iota
Message
Int
Float
String
Bytes
Bool
)

type Info struct {
Name string
CUEName string
Attr cue.Attribute
Value cue.Value

CompositeType CompositeType
ValueType ValueType
Type string

// For maps only
KeyType ValueType // only for maps
KeyTypeString string
}

func FromIter(i *cue.Iterator) (info Info, err error) {
return FromValue(i.Label(), i.Value())
}

func FromValue(name string, v cue.Value) (info Info, err error) {
a := v.Attribute("protobuf")

info.Name = name
info.CUEName = name

if a.Err() == nil {
info.Attr = a

s, ok, err := a.Lookup(1, "name")
if err != nil {
return info, err
}
if ok {
info.Name = strings.TrimSpace(s)
}

info.Type, err = a.String(1)
if err != nil {
return info, err
}
}

switch v.IncompleteKind() {
case cue.ListKind:
info.CompositeType = List
e, _ := v.Elem()
if e.Exists() {
v = e
} else {
for i, _ := v.List(); i.Next(); {
v = i.Value()
break
}
}

case cue.StructKind:
if strings.HasPrefix(info.Type, "map[") {
a := strings.SplitN(info.Type[len("map["):], ",", 2)
info.KeyTypeString = strings.TrimSpace(a[0])
switch info.KeyTypeString {
case "string":
info.KeyType = String
case "bytes":
info.KeyType = Bytes
case "double", "float":
info.KeyType = Float
case "bool":
info.KeyType = Bool
default:
info.KeyType = Int // Assuming
}
info.CompositeType = Map
v, _ = v.Elem()
}
}

info.Value = v

switch v.IncompleteKind() {
case cue.StructKind:
info.ValueType = Message

case cue.StringKind:
info.ValueType = String

case cue.BytesKind:
info.ValueType = Bytes

case cue.BoolKind:
info.ValueType = Bool

case cue.IntKind:
info.ValueType = Int

case cue.FloatKind, cue.NumberKind:
info.ValueType = Float
}

return info, nil
}

0 comments on commit c028026

Please sign in to comment.