github.com/opencontainers/umoci@v0.4.8-0.20240508124516-656e4836fb0d/oci/casext/json.go (about) 1 /* 2 * umoci: Umoci Modifies Open Containers' Images 3 * Copyright (C) 2016-2020 SUSE LLC 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package casext 19 20 import ( 21 "bytes" 22 "context" 23 "encoding/json" 24 25 "github.com/opencontainers/go-digest" 26 "github.com/pkg/errors" 27 ) 28 29 // PutBlobJSON adds a new JSON blob to the image (marshalled from the given 30 // interface). This is equivalent to calling PutBlob() with a JSON payload 31 // as the reader. Note that due to intricacies in the Go JSON 32 // implementation, we cannot guarantee that two calls to PutBlobJSON() will 33 // return the same digest. 34 // 35 // TODO: Use a proper JSON serialisation library, which actually guarantees 36 // 37 // consistent output. Go's JSON library doesn't even attempt to sort 38 // map[...]... objects (which have their iteration order randomised in 39 // Go). 40 func (e Engine) PutBlobJSON(ctx context.Context, data interface{}) (digest.Digest, int64, error) { 41 var buffer bytes.Buffer 42 if err := json.NewEncoder(&buffer).Encode(data); err != nil { 43 return "", -1, errors.Wrap(err, "encode JSON") 44 } 45 return e.PutBlob(ctx, &buffer) 46 }