288 lines
6.2 KiB
Go
288 lines
6.2 KiB
Go
|
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
|
||
|
}
|