github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/encoding/kmgYaml/kmgYaml.go (about)

     1  package kmgYaml
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"io/ioutil"
     8  	"os"
     9  	"strconv"
    10  )
    11  
    12  func ReadFile(path string, obj interface{}) error {
    13  	b, err := ioutil.ReadFile(path)
    14  	if err != nil {
    15  		return err
    16  	}
    17  	return Unmarshal(b, obj)
    18  }
    19  
    20  func MustReadFile(path string, obj interface{}) {
    21  	err := ReadFile(path, obj)
    22  	if err != nil {
    23  		panic(err)
    24  	}
    25  }
    26  
    27  func MustMarshal(obj interface{}) []byte {
    28  	out, err := Marshal(obj)
    29  	if err != nil {
    30  		panic(err)
    31  	}
    32  	return out
    33  }
    34  
    35  func MustUnmarshal(in []byte, obj interface{}) {
    36  	err := Unmarshal(in, obj)
    37  	if err != nil {
    38  		panic(err)
    39  	}
    40  }
    41  
    42  func WriteFile(path string, obj interface{}) error {
    43  	out, err := Marshal(obj)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	return ioutil.WriteFile(path, out, os.FileMode(0777))
    48  }
    49  
    50  func MustWriteFile(path string, obj interface{}) {
    51  	err := WriteFile(path, obj)
    52  	if err != nil {
    53  		panic(err)
    54  	}
    55  }
    56  
    57  func Yaml2JsonIo(r io.Reader, w io.Writer) (err error) {
    58  	input, err := ioutil.ReadAll(r)
    59  	if err != nil {
    60  		return
    61  	}
    62  	var data interface{}
    63  	err = Unmarshal(input, &data)
    64  	if err != nil {
    65  		return
    66  	}
    67  	data, err = Yaml2JsonTransformData(data)
    68  	if err != nil {
    69  		return
    70  	}
    71  	output, err := json.Marshal(data)
    72  	if err != nil {
    73  		return
    74  	}
    75  	_, err = w.Write(output)
    76  	return
    77  }
    78  
    79  func Yaml2JsonIndentIo(r io.Reader, w io.Writer) (err error) {
    80  	input, err := ioutil.ReadAll(r)
    81  	if err != nil {
    82  		return
    83  	}
    84  	var data interface{}
    85  	err = Unmarshal(input, &data)
    86  	if err != nil {
    87  		return
    88  	}
    89  	data, err = Yaml2JsonTransformData(data)
    90  	if err != nil {
    91  		return
    92  	}
    93  	output, err := json.MarshalIndent(data, "", "  ")
    94  	if err != nil {
    95  		return
    96  	}
    97  	_, err = w.Write(output)
    98  	return
    99  }
   100  
   101  //先 Yaml2JsonIo , 后 Json2YamlIo 可能不会获得完全一致的结果
   102  func Json2YamlIo(r io.Reader, w io.Writer) error {
   103  	input, err := ioutil.ReadAll(r)
   104  	if err != nil {
   105  		return err
   106  	}
   107  	var data interface{}
   108  	err = json.Unmarshal(input, &data)
   109  	if err != nil {
   110  		return err
   111  	}
   112  	output, err := Marshal(data)
   113  	if err != nil {
   114  		return err
   115  	}
   116  	_, err = w.Write(output)
   117  	return err
   118  }
   119  
   120  func Yaml2JsonTransformData(in interface{}) (out interface{}, err error) {
   121  	switch in.(type) {
   122  	case map[interface{}]interface{}:
   123  		o := make(map[string]interface{})
   124  		for k, v := range in.(map[interface{}]interface{}) {
   125  			sk := ""
   126  			switch k.(type) {
   127  			case string:
   128  				sk = k.(string)
   129  			case int:
   130  				sk = strconv.Itoa(k.(int))
   131  			default:
   132  				return nil, fmt.Errorf("type not match: expect map key string or int get: %T", k)
   133  			}
   134  			v, err = Yaml2JsonTransformData(v)
   135  			if err != nil {
   136  				return nil, err
   137  			}
   138  			o[sk] = v
   139  		}
   140  		return o, nil
   141  	case []interface{}:
   142  		in1 := in.([]interface{})
   143  		len1 := len(in1)
   144  		o := make([]interface{}, len1)
   145  		for i := 0; i < len1; i++ {
   146  			o[i], err = Yaml2JsonTransformData(in1[i])
   147  			if err != nil {
   148  				return nil, err
   149  			}
   150  		}
   151  		return o, nil
   152  	default:
   153  		return in, nil
   154  	}
   155  }
   156  
   157  func debugPrintf(s string, sa ...interface{}) {
   158  	fmt.Printf(s, sa...)
   159  }