diff options
| author | Jeff Carr <[email protected]> | 2025-10-22 09:20:36 -0500 | 
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-22 09:20:36 -0500 | 
| commit | 26519e946e7e160f0d96e9af9e69090ff8e292f5 (patch) | |
| tree | 28a210d0565155098eebe13ca8f63817dd8ca81a | |
| parent | 367f681a490a48944c5d05ba0fe89d0099c0337d (diff) | |
lib/config is now using this
| -rw-r--r-- | identify.go | 93 | 
1 files changed, 93 insertions, 0 deletions
diff --git a/identify.go b/identify.go index 0de53a2..c27dd51 100644 --- a/identify.go +++ b/identify.go @@ -1,9 +1,19 @@  package filepb  import ( +	"errors" +	"fmt"  	"os" +	"strings" + +	"google.golang.org/protobuf/encoding/protojson" +	"google.golang.org/protobuf/encoding/prototext" +	"google.golang.org/protobuf/proto"  ) +var ErrEmpty error = fmt.Errorf("config file was empty") +var ErrMarshal error = fmt.Errorf("protobuf parse error") +  // print the protobuf in human form  func IdentifyPB(filename string) (string, string, error) {  	data, err := os.ReadFile(filename) @@ -20,3 +30,86 @@ func IdentifyPB(filename string) (string, string, error) {  	// log.Info("Identify protobuf file uuid =", pb.Uuid, "version =", pb.Version)  	return pb.Uuid, pb.Version, nil  } + +func (pb *FakeFile) loadFromFilename(fullname string) error { +	if strings.HasSuffix(fullname, ".text") { +		return loadTEXT(pb, fullname) +	} +	if strings.HasSuffix(fullname, ".json") { +		return loadJSON(pb, fullname) +	} +	if strings.HasSuffix(fullname, ".pb") { +		return loadPB(pb, fullname) +	} + +	return fmt.Errorf("unknown filetype '%s'", fullname) +} + +func loadPB(pb proto.Message, fullname string) error { +	data, err := loadFile(fullname) +	if err != nil { +		// set pb.Filename that was attempted +		return err +	} + +	if err = proto.Unmarshal(data, pb); err != nil { +		return err +	} + +	return nil +} + +func loadTEXT(pb proto.Message, fullname string) error { +	var data []byte +	var err error +	if data, err = loadFile(fullname); err != nil { +		return err +	} + +	// don't even bother with Marshal() +	if data == nil { +		return ErrEmpty // file is empty +	} + +	// Unmarshal() +	if err = prototext.Unmarshal(data, pb); err != nil { +		return ErrMarshal +	} +	return nil +} + +// json files are backup Marshal() data in case .text Unmarshal() fails +// they always should have the ".text" filename in them +func loadJSON(pb proto.Message, fullname string) error { +	var data []byte +	var err error +	if data, err = loadFile(fullname); err != nil { +		return err +	} + +	// don't even bother with Marshal() +	if data == nil { +		return ErrEmpty // file is empty +	} + +	// Unmarshal() +	if err = protojson.Unmarshal(data, pb); err != nil { +		return ErrMarshal +	} +	return nil +} + +func loadFile(fullname string) ([]byte, error) { +	data, err := os.ReadFile(fullname) +	if errors.Is(err, os.ErrNotExist) { +		// if file does not exist, just return nil. this +		return nil, err +	} +	if err != nil { +		return nil, err +	} +	if len(data) == 0 { +		return data, ErrEmpty +	} +	return data, nil +}  | 
