Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I assign value to a repeated oneof field in a protobuf message?

I have a protobuf message CoverageReport like this:

 message Deductible {
  double amount = 1;
  string currency = 2;
}

message Insurance{
  string type = 1;
  string policyNumber = 2;
  string agreementName = 3;
  string appliedTo = 4;
  string validFrom = 5;
  string validTo = 6;
  Deductible deductible = 7;
}

message Warranty {
  string type = 1;
  string warrantyType = 2;
  string agreementName = 3;
  string appliedTo = 4;
  string validFrom = 5;
  string validTo = 6;
}

message Coverage {
  oneof item {
    Insurance insurance = 1;
    Warranty warranty = 2;
  }
}

message CoverageReport {
  bool coverageAppliance = 1;
  repeated Coverage coverages = 2;
}

In my program I'm trying to assign values to a message instance, but I'm not sure how to assign to the oneof field Coverage which should then be appended to Coverages, like this I get a response from an api, which i unmarshal into the struct CoverageReport which has similar structure to the protobuf. Then i need to create a protobuf message using the values from the struct. But it doesn't seem to work to asssign to the one of field!

type CoverageReport struct {
    
    CoverageAppliance string `json:"coverageAppliance"`
    
    Coverages         []struct {
        Type          string `json:"type"`
        PolicyNumber  string `json:"policyNumber,omitempty"`
        AgreementName string `json:"agreementName"`
        AppliedTo     string `json:"appliedTo"`
        ValidFrom     string `json:"validFrom"`
        ValidTo       string `json:"validTo"`
        
        Deductible    struct {
            Amount   float64 `json:"amount"`
            Currency string  `json:"currency"`
        } `json:"deductible,omitempty"`
        
        WarrantyType string `json:"warrantyType,omitempty"`
    
    } `json:"coverages"`
}

var coveragereport *CoverageReport


err = json.Unmarshal(body, &coveragereport)

var cr *vcsproto.CoverageReport

    if coveragereport.CoverageAppliance == "Yes" {
        cr.CoverageAppliance = true
    }

    for _, item := range coveragereport.Coverages {
        
        if item.Type == "Warranty"{

            var warranty *vcsproto.Warranty 
            
            warranty.Type = item.Type
            warranty.WarrantyType = item.WarrantyType
            warranty.AgreementName = item.AgreementName
            warranty.AppliedTo = item.AppliedTo
            warranty.ValidFrom = item.ValidFrom
            warranty.ValidTo = item.ValidTo

            var coverage *vcsproto.Coverage
            coverage.Item.Warranty = warranty

            cr.Coverages = append(cr.Coverages, coverage)

        } else {

            var insurance *vcsproto.Insurance
             
            insurance.Type = item.Type
            insurance.PolicyNumber = item.PolicyNumber
            insurance.AgreementName = item.AgreementName
            insurance.AppliedTo = item.AppliedTo
            insurance.ValidFrom = item.ValidFrom
            insurance.ValidTo = item.ValidTo. 
            insurance.Deductible.Currency = item.Deductible.Currency 
            insurance.Deductible.Amount = item.Deductible.Amount 

            var coverage *vcsproto.Coverage
            coverage.Item.Insurance = Insurance

            cr.Coverages = append(cr.Coverages, coverage)

        }
    }
like image 805
user6714507 Avatar asked Dec 06 '25 02:12

user6714507


1 Answers

Take a look in the generated code here.

You do not assign directly to the Warranty nor Insurance subfields, but directly to the Item field. so coverage.Item = {insurance/warranty} should work.

Also note that in your code you're assigning coverage.Item.Insurance = Insurance - you probably meant the second Insurance to be the variable insurance instead.

like image 105
hbejgel Avatar answered Dec 08 '25 15:12

hbejgel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!