Git Product home page Git Product logo

Comments (5)

grepory avatar grepory commented on August 18, 2024 11

I figured it out, for posterity's sake:

We're going with a combination of a type switch and:

var (
    logger   = logging.GetLogger("checker")
    registry = make(map[string]reflect.Type)
)

func init() {
    registry["HttpCheck"] = reflect.TypeOf(HttpCheck{})
}

func UnmarshalAny(any *Any) (interface{}, error) {
    class := any.TypeUrl
    bytes := any.Value

    instance := reflect.New(registry[class]).Interface()
    err := proto.Unmarshal(bytes, instance.(proto.Message))
    if err != nil {
        return nil, err
    }
    logger.Debug("instance: %v", instance)

    return instance, nil
}

This could be made more elegant, but it works for now.

from protobuf.

jmhodges avatar jmhodges commented on August 18, 2024 9

For folks like me coming to this from gooling around, there's now helper functions at ptypes.MarshalAny and ptypes.UnmarshalAny

from protobuf.

grepory avatar grepory commented on August 18, 2024

An example:

from a .proto:

type TestCheckRequest struct {
    MaxHosts  int32      `protobuf:"varint,1,opt,name=max_hosts" json:"max_hosts,omitempty"`
    Deadline  *Timestamp `protobuf:"bytes,2,opt,name=deadline" json:"deadline,omitempty"`
    CheckSpec *Any       `protobuf:"bytes,3,opt,name=check_spec" json:"check_spec,omitempty"`
}

type HttpCheck struct {
    Name     string    `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
    Path     string    `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"`
    Protocol string    `protobuf:"bytes,3,opt,name=protocol" json:"protocol,omitempty"`
    Port     int32     `protobuf:"varint,4,opt,name=port" json:"port,omitempty"`
    Verb     string    `protobuf:"bytes,5,opt,name=verb" json:"verb,omitempty"`
    Target   *Target   `protobuf:"bytes,6,opt,name=target" json:"target,omitempty"`
    Headers  []*Header `protobuf:"bytes,7,rep,name=headers" json:"headers,omitempty"`
    Body     string    `protobuf:"bytes,8,opt,name=body" json:"body,omitempty"`
}

I would put an HttpCheck object in the CheckSpec field on a TestCheckRequest message.

Unmarshaling this has proven difficult.

from protobuf.

chai2010 avatar chai2010 commented on August 18, 2024

You can use google/protobuf/any.proto:
https://github.com/chai2010/notepadplus-protobuf/blob/master/testdata/googleapis/google/protobuf/any.proto

from protobuf.

grepory avatar grepory commented on August 18, 2024

Yeah. I'm just not going to use Any.

from protobuf.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.