|
- 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
- }
|