123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- package mxj
- import (
- "fmt"
- "io"
- "os"
- )
- type Maps []Map
- func NewMaps() Maps {
- return make(Maps, 0)
- }
- type MapRaw struct {
- M Map
- R []byte
- }
- // NewMapsFromXmlFile - creates an array from a file of JSON values.
- func NewMapsFromJsonFile(name string) (Maps, error) {
- fi, err := os.Stat(name)
- if err != nil {
- return nil, err
- }
- if !fi.Mode().IsRegular() {
- return nil, fmt.Errorf("file %s is not a regular file", name)
- }
- fh, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer fh.Close()
- am := make([]Map, 0)
- for {
- m, raw, err := NewMapJsonReaderRaw(fh)
- if err != nil && err != io.EOF {
- return am, fmt.Errorf("error: %s - reading: %s", err.Error(), string(raw))
- }
- if len(m) > 0 {
- am = append(am, m)
- }
- if err == io.EOF {
- break
- }
- }
- return am, nil
- }
- // ReadMapsFromJsonFileRaw - creates an array of MapRaw from a file of JSON values.
- func NewMapsFromJsonFileRaw(name string) ([]MapRaw, error) {
- fi, err := os.Stat(name)
- if err != nil {
- return nil, err
- }
- if !fi.Mode().IsRegular() {
- return nil, fmt.Errorf("file %s is not a regular file", name)
- }
- fh, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer fh.Close()
- am := make([]MapRaw, 0)
- for {
- mr := new(MapRaw)
- mr.M, mr.R, err = NewMapJsonReaderRaw(fh)
- if err != nil && err != io.EOF {
- return am, fmt.Errorf("error: %s - reading: %s", err.Error(), string(mr.R))
- }
- if len(mr.M) > 0 {
- am = append(am, *mr)
- }
- if err == io.EOF {
- break
- }
- }
- return am, nil
- }
- // NewMapsFromXmlFile - creates an array from a file of XML values.
- func NewMapsFromXmlFile(name string) (Maps, error) {
- fi, err := os.Stat(name)
- if err != nil {
- return nil, err
- }
- if !fi.Mode().IsRegular() {
- return nil, fmt.Errorf("file %s is not a regular file", name)
- }
- fh, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer fh.Close()
- am := make([]Map, 0)
- for {
- m, raw, err := NewMapXmlReaderRaw(fh)
- if err != nil && err != io.EOF {
- return am, fmt.Errorf("error: %s - reading: %s", err.Error(), string(raw))
- }
- if len(m) > 0 {
- am = append(am, m)
- }
- if err == io.EOF {
- break
- }
- }
- return am, nil
- }
- // NewMapsFromXmlFileRaw - creates an array of MapRaw from a file of XML values.
- // NOTE: the slice with the raw XML is clean with no extra capacity - unlike NewMapXmlReaderRaw().
- // It is slow at parsing a file from disk and is intended for relatively small utility files.
- func NewMapsFromXmlFileRaw(name string) ([]MapRaw, error) {
- fi, err := os.Stat(name)
- if err != nil {
- return nil, err
- }
- if !fi.Mode().IsRegular() {
- return nil, fmt.Errorf("file %s is not a regular file", name)
- }
- fh, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer fh.Close()
- am := make([]MapRaw, 0)
- for {
- mr := new(MapRaw)
- mr.M, mr.R, err = NewMapXmlReaderRaw(fh)
- if err != nil && err != io.EOF {
- return am, fmt.Errorf("error: %s - reading: %s", err.Error(), string(mr.R))
- }
- if len(mr.M) > 0 {
- am = append(am, *mr)
- }
- if err == io.EOF {
- break
- }
- }
- return am, nil
- }
- // ------------------------ Maps writing -------------------------
- // These are handy-dandy methods for dumping configuration data, etc.
- // JsonString - analogous to mv.Json()
- func (mvs Maps) JsonString(safeEncoding ...bool) (string, error) {
- var s string
- for _, v := range mvs {
- j, err := v.Json()
- if err != nil {
- return s, err
- }
- s += string(j)
- }
- return s, nil
- }
- // JsonStringIndent - analogous to mv.JsonIndent()
- func (mvs Maps) JsonStringIndent(prefix, indent string, safeEncoding ...bool) (string, error) {
- var s string
- var haveFirst bool
- for _, v := range mvs {
- j, err := v.JsonIndent(prefix, indent)
- if err != nil {
- return s, err
- }
- if haveFirst {
- s += "\n"
- } else {
- haveFirst = true
- }
- s += string(j)
- }
- return s, nil
- }
- // XmlString - analogous to mv.Xml()
- func (mvs Maps) XmlString() (string, error) {
- var s string
- for _, v := range mvs {
- x, err := v.Xml()
- if err != nil {
- return s, err
- }
- s += string(x)
- }
- return s, nil
- }
- // XmlStringIndent - analogous to mv.XmlIndent()
- func (mvs Maps) XmlStringIndent(prefix, indent string) (string, error) {
- var s string
- for _, v := range mvs {
- x, err := v.XmlIndent(prefix, indent)
- if err != nil {
- return s, err
- }
- s += string(x)
- }
- return s, nil
- }
- // JsonFile - write Maps to named file as JSON
- // Note: the file will be created, if necessary; if it exists it will be truncated.
- // If you need to append to a file, open it and use JsonWriter method.
- func (mvs Maps) JsonFile(file string, safeEncoding ...bool) error {
- var encoding bool
- if len(safeEncoding) == 1 {
- encoding = safeEncoding[0]
- }
- s, err := mvs.JsonString(encoding)
- if err != nil {
- return err
- }
- fh, err := os.Create(file)
- if err != nil {
- return err
- }
- defer fh.Close()
- fh.WriteString(s)
- return nil
- }
- // JsonFileIndent - write Maps to named file as pretty JSON
- // Note: the file will be created, if necessary; if it exists it will be truncated.
- // If you need to append to a file, open it and use JsonIndentWriter method.
- func (mvs Maps) JsonFileIndent(file, prefix, indent string, safeEncoding ...bool) error {
- var encoding bool
- if len(safeEncoding) == 1 {
- encoding = safeEncoding[0]
- }
- s, err := mvs.JsonStringIndent(prefix, indent, encoding)
- if err != nil {
- return err
- }
- fh, err := os.Create(file)
- if err != nil {
- return err
- }
- defer fh.Close()
- fh.WriteString(s)
- return nil
- }
- // XmlFile - write Maps to named file as XML
- // Note: the file will be created, if necessary; if it exists it will be truncated.
- // If you need to append to a file, open it and use XmlWriter method.
- func (mvs Maps) XmlFile(file string) error {
- s, err := mvs.XmlString()
- if err != nil {
- return err
- }
- fh, err := os.Create(file)
- if err != nil {
- return err
- }
- defer fh.Close()
- fh.WriteString(s)
- return nil
- }
- // XmlFileIndent - write Maps to named file as pretty XML
- // Note: the file will be created,if necessary; if it exists it will be truncated.
- // If you need to append to a file, open it and use XmlIndentWriter method.
- func (mvs Maps) XmlFileIndent(file, prefix, indent string) error {
- s, err := mvs.XmlStringIndent(prefix, indent)
- if err != nil {
- return err
- }
- fh, err := os.Create(file)
- if err != nil {
- return err
- }
- defer fh.Close()
- fh.WriteString(s)
- return nil
- }
|