rust-yaml
A complete, fast, and safe YAML 1.2 library for Rust with advanced features and security-first design. This library provides comprehensive YAML processing capabilities with full specification compliance, advanced security features, and excellent performance.
Status: Production-ready with comprehensive test coverage (134 unit tests + 150+ integration tests passing). All YAML 1.2 core features implemented and battle-tested.
Table of Contents
- rust-yaml
Why rust-yaml?
rust-yaml stands out from other YAML libraries by providing:
- 🎯 Complete YAML 1.2 compliance - Full specification support, not just basic parsing
- ⚓ Smart serialization - Automatic anchor/alias generation for shared data structures
- 🛡️ Security first - No unsafe code, protection against malicious input, configurable limits
- 🚀 High performance - Zero-copy parsing, minimal allocations, optimized algorithms
- 📍 Developer-friendly errors - Precise error locations with visual context and suggestions
- 🔄 Structural round-trips - Parse → serialize → parse with data consistency
- 🏗️ Production ready - Comprehensive testing, fuzzing, and real-world validation
Features
Core Features
- 🚀 Fast: Zero-copy parsing where possible, optimized for performance
- 🛡️ Safe: Memory safety guaranteed, no unsafe code, secure deserialization
- 🔒 Reliable: Comprehensive error handling with precise position information
- 🧹 Clean: Well-documented API following Rust best practices
- 📝 YAML 1.2: Full YAML 1.2 specification compliance
- 🔄 Round-trip: Structural parse → serialize → parse consistency
Advanced Features
- ⚓ Anchors & Aliases: Full support for
&anchorand*aliasreferences - 📄 Multi-line Strings: Literal (
|) and folded (>) block scalars - 🏷️ Type Tags: Explicit type specification (
!!str,!!int,!!map,!!seq) - 🎯 Smart Serialization: Automatic anchor/alias generation for shared values
- 📍 Enhanced Errors: Contextual error reporting with visual indicators
- 🔧 Flexible API: Multiple loader types for different security levels
Quick Start
Add this to your Cargo.toml:
[]
= "0.0.5"
Basic Usage
use Yaml;
Multi-Document Support
use Yaml;
let yaml = new;
let multi_doc = r#"
document: 1
data: [1, 2, 3]
---
document: 2
data: [4, 5, 6]
---
document: 3
data: [7, 8, 9]
"#;
let documents = yaml.load_all_str?;
println!;
Custom Configuration
use ;
let config = YamlConfig ;
let yaml = with_config;
Advanced Features Examples
Anchors and Aliases
use Yaml;
let yaml = new;
let yaml_with_anchors = r#"
defaults: &defaults
timeout: 30
retries: 3
development:
<<: *defaults
debug: true
production:
<<: *defaults
debug: false
"#;
let parsed = yaml.load_str?;
Multi-line Strings
let yaml_with_multiline = r#"
# Literal block scalar (preserves newlines)
sql_query: |
SELECT name, age
FROM users
WHERE active = true
ORDER BY name;
# Folded block scalar (folds newlines to spaces)
description: >
This is a long description that will be
folded into a single line when parsed,
making it easier to read in the YAML file.
"#;
let parsed = yaml.load_str?;
Explicit Type Tags
let yaml_with_tags = r#"
string_value: !!str 42 # Force as string
int_value: !!int "123" # Force as integer
float_value: !!float "3.14" # Force as float
bool_value: !!bool "yes" # Force as boolean
sequence: !!seq [a, b, c] # Explicit sequence
mapping: !!map {key: value} # Explicit mapping
"#;
let parsed = yaml.load_str?;
Complex Keys (Sequences and Mappings as Keys)
// YAML 1.2 supports using complex structures as mapping keys
let yaml_with_complex_keys = r#"
# Sequence as a key
? [name, age]
: [John, 30]
# Mapping as a key
? {first: Alice, last: Smith}
: person_data
# Mixed with regular keys
simple_key: simple_value
? [complex, sequence, key]
: complex_value
"#;
let parsed = yaml.load_str?;
// The parser correctly handles complex keys and can round-trip them
let serialized = yaml.dump_str?;
Real-World Usage
Configuration Management
use Yaml;
// Load application configuration with anchors for shared settings
let config_yaml = r#"
defaults: &defaults
timeout: 30
retry_count: 3
log_level: info
database:
<<: *defaults
host: localhost
port: 5432
api:
<<: *defaults
host: 0.0.0.0
port: 8080
cors_enabled: true
"#;
let config = yaml.load_str?;
Data Processing with Type Safety
// Process data with explicit types to ensure correctness
let data_yaml = r#"
users:
- id: !!int "1001"
name: !!str "Alice"
active: !!bool "yes"
score: !!float "95.5"
- id: !!int "1002"
name: !!str "Bob"
active: !!bool "no"
score: !!float "87.2"
"#;
let users = yaml.load_str?;
Smart Serialization
use ;
use IndexMap;
// Create shared data structure
let shared_config = ;
// Use it multiple times - rust-yaml will automatically create anchors/aliases
let mut root = new;
root.insert;
root.insert;
let output = yaml.dump_str?;
// Output will contain: dev: &anchor0 ... prod: *anchor0
Value Types
The library provides a comprehensive Value enum for representing YAML data:
use Value;
let values = vec!;
Error Handling
Advanced error reporting with precise position information and visual context:
use ;
let yaml = new;
let result = yaml.load_str;
match result
Loader Types
Different loader types provide varying levels of functionality and security:
Safe(default): Only basic YAML types, no code executionBase: Minimal type set for simple use casesRoundTrip: Preserves formatting and comments (partial implementation available)Full: All features including potentially unsafe operations
Performance
rust-yaml is designed for high performance:
- Zero-copy parsing where possible to minimize allocations
- Efficient memory usage with
IndexMapfor preserving key order - Smart serialization with automatic anchor/alias generation reduces output size
- Streaming parser support for memory-efficient processing
- Optimized string handling with intelligent quoting decisions
- Minimal allocations during parsing and serialization
Benchmarks
# Run performance benchmarks
# Run with release optimizations
# Profile memory usage
Feature Flags
[]
= { = "0.0.5", = ["serde", "large-documents"] }
default = ["mmap", "preserve-order"]: Default feature set with memory mapping and order preservationserde: Enable serde serialization support for Rust structspreserve-order: Always preserve key insertion order (uses IndexMap)large-documents: Optimizations for very large YAML documentsasync: Async/await support with tokio integrationmmap: Memory-mapped file support for large documentsfull: All features enabled
Feature Status
✅ Core YAML 1.2 Implementation (COMPLETE)
Parsing & Generation
- ✅ Complete YAML 1.2 parsing and generation - Full specification support
- ✅ Core data types - null, bool, int, float, string, sequence, mapping
- ✅ Safe loading/dumping - Security controls and configurable limits
- ✅ Multi-document support - Proper document boundaries with
--- - ✅ Flow and block styles - Automatic detection and round-trip preservation
- ✅ Structural round-trip support - Parse → serialize → parse with data consistency
✅ Advanced Features (COMPLETE)
References & Inheritance
- ✅ Anchors and aliases (
&anchor,*alias) with proper nested mapping support - ✅ Merge keys (
<<) - Complete inheritance support with override behavior - ✅ Smart serialization - Automatic anchor/alias generation for shared values
Text Processing
- ✅ Multi-line strings - Literal (
|) and folded (>) block scalars - ✅ Quote style preservation - Single vs double quotes round-trip
- ✅ Indentation style preservation - Spaces vs tabs detection and preservation
Type System
- ✅ Explicit type tags (
!!str,!!int,!!map,!!seq) with normalization - ✅ Complex key support - Sequences and mappings as mapping keys
Enterprise Features
- ✅ Complete comment correlation system - Full round-trip comment preservation
- ✅ Schema validation with custom rules - Comprehensive validation framework
- ✅ Enhanced error handling - Contextual reporting with visual indicators
✅ Comment Preservation (IMPLEMENTED)
Full Round-trip Comment Preservation
- ✅ Infrastructure complete - CommentedValue, RoundTripConstructor, comment-aware scanner
- ✅ API available -
load_str_with_comments(),dump_str_with_comments() - ✅ Comment correlation - Comments properly correlated with parsed values
- ✅ Full round-trip - Comments preserved during parse/serialize cycle
- ✅ All comment types - Leading, trailing, and inner comments supported
// Full comment preservation example
let config = YamlConfig ;
let yaml = with_config;
// Parse with full comment preservation
let commented_value = yaml.load_str_with_comments?;
// Serialize back with comments intact
let output = yaml.dump_str_with_comments?;
// Output includes all original comments in appropriate positions
✅ Schema Validation (IMPLEMENTED)
Enterprise-Grade Validation System
- ✅ Comprehensive rule system - Type, pattern, range, length, enum validation
- ✅ Complex validation logic - Conditional (if-then-else), anyOf, allOf, oneOf, not
- ✅ Object validation - Property schemas, required fields, additional properties control
- ✅ Array validation - Item schemas, length constraints
- ✅ Custom validators - User-defined validation functions
- ✅ Detailed error reporting - Path-specific errors with human-readable messages
- ✅ Integration with YAML API - Direct validation during parsing
use ;
use Regex;
use HashMap;
// Create comprehensive schema
let mut properties = new;
properties.insert;
properties.insert;
properties.insert;
let schema = with_type
.rule
.rule
.info;
let yaml = new;
// Load and validate in one step
let user_data = yaml.load_str_with_schema?;
// Or validate existing data
let parsed_data = yaml.load_str?;
yaml.validate_with_schema?; // Will fail - missing email
🎯 Future Enhancements
Enterprise Features
- Custom type registration for Rust structs
- Plugin system for extensible functionality
Performance & Developer Tools
- Streaming optimizations for very large documents
- Configuration file editing utilities
- YAML formatting and linting tools
- Advanced profiling and debugging tools
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
Development Setup
# Clone the repository
# Set up development environment (git hooks, components, etc.)
# Run all tests
# Run CI pipeline locally (same as GitHub Actions)
# Quick development checks (format, lint, test)
Development Commands
The project includes a comprehensive Makefile with 60+ commands for development workflow:
Testing
Code Quality
Documentation & Reports
Coverage Reports
# Alternative coverage tools
CI/CD & Checks
Markdown & Documentation
Documentation
Complete Documentation Index
The project includes comprehensive documentation in the docs/ directory:
Core Documentation
- Development Guide - Complete development setup and workflow
- Migration Guide - Migrating from other YAML libraries
- Roadmap - Current status and future planned features
Feature Documentation
- Merge Keys - Complete guide to YAML merge key inheritance (
<<) - Tag System - Type tags and explicit typing system
- Directives - YAML directives (
%YAML,%TAG) support - Zero-Copy Parsing - Memory-efficient parsing techniques
- Streaming - Large document processing and async support
Performance & Analysis
- Performance Optimizations - Technical performance details
- Benchmark Results - Comprehensive performance comparisons
- Library Comparison - Comparison with other Rust YAML libraries
Development Tools
- Pre-commit Setup - Git hooks and code quality automation
- Version Management - Release process and versioning
Project Files
- Code of Conduct - Community guidelines
- Contributing - Contribution guidelines and process
- Security - Security policy and vulnerability reporting
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- Inspired by ruamel-yaml Python library and its focus on round-trip preservation
- Built following Rust security and performance best practices with zero unsafe code
- Thanks to the YAML 1.2 specification contributors for the comprehensive standard
- Grateful to the Rust community for excellent libraries like
indexmapandthiserror
Related Projects
- serde_yaml: Serde-based YAML library
- yaml-rust: Pure Rust YAML library
- ruamel-yaml: Original Python implementation