xref: /aosp_15_r20/build/blueprint/gobtools/gob_tools.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2024 Google Inc. All rights reserved.
2*1fa6dee9SAndroid Build Coastguard Worker//
3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*1fa6dee9SAndroid Build Coastguard Worker//
7*1fa6dee9SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*1fa6dee9SAndroid Build Coastguard Worker//
9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License.
14*1fa6dee9SAndroid Build Coastguard Worker
15*1fa6dee9SAndroid Build Coastguard Workerpackage gobtools
16*1fa6dee9SAndroid Build Coastguard Worker
17*1fa6dee9SAndroid Build Coastguard Workerimport (
18*1fa6dee9SAndroid Build Coastguard Worker	"bytes"
19*1fa6dee9SAndroid Build Coastguard Worker	"encoding/gob"
20*1fa6dee9SAndroid Build Coastguard Worker)
21*1fa6dee9SAndroid Build Coastguard Worker
22*1fa6dee9SAndroid Build Coastguard Workertype CustomGob[T any] interface {
23*1fa6dee9SAndroid Build Coastguard Worker	ToGob() *T
24*1fa6dee9SAndroid Build Coastguard Worker	FromGob(data *T)
25*1fa6dee9SAndroid Build Coastguard Worker}
26*1fa6dee9SAndroid Build Coastguard Worker
27*1fa6dee9SAndroid Build Coastguard Workerfunc CustomGobEncode[T any](cg CustomGob[T]) ([]byte, error) {
28*1fa6dee9SAndroid Build Coastguard Worker	w := new(bytes.Buffer)
29*1fa6dee9SAndroid Build Coastguard Worker	encoder := gob.NewEncoder(w)
30*1fa6dee9SAndroid Build Coastguard Worker	err := encoder.Encode(cg.ToGob())
31*1fa6dee9SAndroid Build Coastguard Worker	if err != nil {
32*1fa6dee9SAndroid Build Coastguard Worker		return nil, err
33*1fa6dee9SAndroid Build Coastguard Worker	}
34*1fa6dee9SAndroid Build Coastguard Worker
35*1fa6dee9SAndroid Build Coastguard Worker	return w.Bytes(), nil
36*1fa6dee9SAndroid Build Coastguard Worker}
37*1fa6dee9SAndroid Build Coastguard Worker
38*1fa6dee9SAndroid Build Coastguard Workerfunc CustomGobDecode[T any](data []byte, cg CustomGob[T]) error {
39*1fa6dee9SAndroid Build Coastguard Worker	r := bytes.NewBuffer(data)
40*1fa6dee9SAndroid Build Coastguard Worker	var value T
41*1fa6dee9SAndroid Build Coastguard Worker	decoder := gob.NewDecoder(r)
42*1fa6dee9SAndroid Build Coastguard Worker	err := decoder.Decode(&value)
43*1fa6dee9SAndroid Build Coastguard Worker	if err != nil {
44*1fa6dee9SAndroid Build Coastguard Worker		return err
45*1fa6dee9SAndroid Build Coastguard Worker	}
46*1fa6dee9SAndroid Build Coastguard Worker	cg.FromGob(&value)
47*1fa6dee9SAndroid Build Coastguard Worker
48*1fa6dee9SAndroid Build Coastguard Worker	return nil
49*1fa6dee9SAndroid Build Coastguard Worker}
50