go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/plist/plist.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package plist
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/json"
     9  	"io"
    10  
    11  	"howett.net/plist"
    12  )
    13  
    14  func ToXml(r io.ReadSeeker) ([]byte, error) {
    15  	// convert file format to xml
    16  	var val interface{}
    17  	dec := plist.NewDecoder(r)
    18  	err := dec.Decode(&val)
    19  	if err != nil {
    20  		return nil, err
    21  	}
    22  
    23  	out := &bytes.Buffer{}
    24  	enc := plist.NewEncoderForFormat(out, plist.XMLFormat)
    25  	err = enc.Encode(val)
    26  	return out.Bytes(), err
    27  }
    28  
    29  func Decode(r io.ReadSeeker) (map[string]interface{}, error) {
    30  	var data map[string]interface{}
    31  	decoder := plist.NewDecoder(r)
    32  	err := decoder.Decode(&data)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	// NOTE: we need to do the extra conversion here to make sure we use supported
    38  	// values by our dict structure: string, float64, int64
    39  	// plist also uses uint64 heavily which we do not support
    40  	// TODO: we really do not want to use the poor-man's json conversion version
    41  	jsondata, err := json.Marshal(data)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	var dataJson map[string]interface{}
    47  	err = json.Unmarshal(jsondata, &dataJson)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	return dataJson, nil
    53  }