Skip to content

Transformer is a Go library that enables conversion between different data formats (JSON, XML, YAML).

License

Notifications You must be signed in to change notification settings

mstgnz/transformer

Repository files navigation

Transformer

Transformer is a Go library that enables conversion between different data formats (JSON, XML, YAML). Using a common data structure, you can perform lossless conversions between these formats.

Turkish Documentation (Türkçe Dokümantasyon)

Features

  • Convert between JSON, XML, and YAML formats
  • Consistent conversion with common data structure
  • Easy to use
  • Type safety
  • Customizable conversion rules
  • High test coverage
  • Thread-safe operations
  • Minimal dependencies

Requirements

  • Go 1.16 or higher
  • Dependencies:
    • gopkg.in/yaml.v3 for YAML operations

Installation

go get github.com/mstgnz/transformer

Usage

JSON Conversions

import "github.com/mstgnz/transformer/tjson" // Read JSON file data, err := tjson.ReadJson("data.json") if err != nil { log.Fatal(err) } // Validate JSON format if !tjson.IsJson(data) { log.Fatal("Invalid JSON format") } // Convert JSON to Node structure node, err := tjson.DecodeJson(data) if err != nil { log.Fatal(err) } // Convert Node structure to JSON jsonData, err := tjson.NodeToJson(node) if err != nil { log.Fatal(err) }

XML Conversions

import "github.com/mstgnz/transformer/txml" // Read XML file data, err := txml.ReadXml("data.xml") if err != nil { log.Fatal(err) } // Validate XML format if !txml.IsXml(data) { log.Fatal("Invalid XML format") } // Convert XML to Node structure node, err := txml.DecodeXml(data) if err != nil { log.Fatal(err) } // Convert Node structure to XML xmlData, err := txml.NodeToXml(node) if err != nil { log.Fatal(err) }

YAML Conversions

import "github.com/mstgnz/transformer/tyaml" // Read YAML file data, err := tyaml.ReadYaml("data.yaml") if err != nil { log.Fatal(err) } // Validate YAML format if !tyaml.IsYaml(data) { log.Fatal("Invalid YAML format") } // Convert YAML to Node structure node, err := tyaml.DecodeYaml(data) if err != nil { log.Fatal(err) } // Convert Node structure to YAML yamlData, err := tyaml.NodeToYaml(node) if err != nil { log.Fatal(err) }

Cross-Format Conversions

// JSON -> XML conversion jsonData := []byte(`{"name": "John", "age": 30}`) node, _ := tjson.DecodeJson(jsonData) xmlData, _ := txml.NodeToXml(node) // XML -> YAML conversion xmlData := []byte(`<root><name>John</name><age>30</age></root>`) node, _ := txml.DecodeXml(xmlData) yamlData, _ := tyaml.NodeToYaml(node) // YAML -> JSON conversion yamlData := []byte("name: John\nage: 30") node, _ := tyaml.DecodeYaml(yamlData) jsonData, _ := tjson.NodeToJson(node)

Package Structure

  • node: Contains core data structure and operations
    • Node structure for representing hierarchical data
    • Value types and type conversion operations
    • Tree traversal and manipulation functions
  • tjson: Handles JSON conversion operations
    • JSON encoding/decoding
    • JSON validation
    • JSON file operations
  • txml: Handles XML conversion operations
    • XML encoding/decoding
    • XML validation
    • XML file operations
    • XML attribute handling
  • tyaml: Handles YAML conversion operations
    • YAML encoding/decoding
    • YAML validation
    • YAML file operations
  • example: Contains example usages
    • Basic conversion examples
    • Complex data structure examples
    • Error handling examples

Data Types

The Node structure supports the following data types:

  • TypeNull: Null value
  • TypeObject: Object (key-value pairs)
    • Supports nested objects
    • Maintains key order
    • Handles circular references
  • TypeArray: Array
    • Supports mixed types
    • Preserves order
  • TypeString: String
  • TypeNumber: Number (integers and floating-point)
  • TypeBoolean: Boolean

Error Handling

The library provides detailed error information for various scenarios:

  • File operations errors
  • Format validation errors
  • Conversion errors
  • Type mismatch errors
  • Structure validation errors

Example error handling:

if err := validateAndConvert(); err != nil { switch e := err.(type) { case *FormatError: log.Printf("Invalid format: %v", e) case *ConversionError: log.Printf("Conversion failed: %v", e) default: log.Printf("Unexpected error: %v", e) } }

Testing

The library has comprehensive test coverage. You can use the following make commands to run tests:

General Test Commands

# Run all tests make test # Run all tests with verbose output make test-verbose # Run tests with coverage make test-cover # Generate HTML coverage report make test-coverage-report

Package Specific Tests

# Run JSON tests make test-json # Run XML tests make test-xml # Run YAML tests make test-yaml # Run Node tests make test-node # Run Benchmark tests make test-bench

Package Specific Coverage Reports

# Run JSON tests with coverage make test-json-cover # Run XML tests with coverage make test-xml-cover # Run YAML tests with coverage make test-yaml-cover # Run Node tests with coverage make test-node-cover

Current test coverage: >90%

Performance

The library is optimized for:

  • Memory efficiency
  • CPU usage
  • Large file handling
  • Concurrent operations

Benchmark Results

goos: darwin goarch: arm64 cpu: Apple M1 BenchmarkJSONMarshal-8 4416622 261.0 ns/op 192 B/op 2 allocs/op BenchmarkXMLMarshal-8 975189 1230 ns/op 4704 B/op 10 allocs/op BenchmarkYAMLMarshal-8 213493 5284 ns/op 16728 B/op 47 allocs/op BenchmarkJSONUnmarshal-8 1000000 1742 ns/op 272 B/op 9 allocs/op BenchmarkXMLUnmarshal-8 370683 3104 ns/op 2328 B/op 56 allocs/op BenchmarkYAMLUnmarshal-8 142972 8640 ns/op 10128 B/op 108 allocs/op BenchmarkLargeJSONMarshal-8 66734 17580 ns/op 10953 B/op 2 allocs/op BenchmarkLargeXMLMarshal-8 12298 97192 ns/op 33456 B/op 15 allocs/op BenchmarkLargeYAMLMarshal-8 2500 466568 ns/op 1581555 B/op 3149 allocs/op

Analysis

  • JSON shows the best performance in both marshaling and unmarshaling operations
    • Marshal: ~261 ns/op with only 2 allocations
    • Unmarshal: ~1.7 µs/op with 9 allocations
  • XML performs slower than JSON
    • Marshal: ~1.2 µs/op with 10 allocations
    • Unmarshal: ~3.1 µs/op with 56 allocations
  • YAML shows the highest resource usage
    • Marshal: ~5.2 µs/op with 47 allocations
    • Unmarshal: ~8.6 µs/op with 108 allocations
  • For large data operations:
    • JSON maintains efficiency with minimal allocations
    • XML shows moderate performance degradation
    • YAML shows significant increase in both time and memory usage

Security

  • Input validation to prevent XML entity attacks
  • Memory limit checks for large files
  • Safe type conversions
  • No external command execution

Contributing

This project is open-source, and contributions are welcome. Feel free to contribute or provide feedback of any kind.

License

This project is licensed under the Apache License, Version 2.0. See the LICENSE file for details.

About

Transformer is a Go library that enables conversion between different data formats (JSON, XML, YAML).

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

 

Packages

No packages published