Skip to main content

kiparse/
lib.rs

1//! # KiParse
2//! 
3//! A KiCad file format parser for PCB and symbol files.
4//! 
5//! KiParse provides parsing capabilities for KiCad's native file formats through
6//! a pragmatic approach focusing on what actually works with real-world files.
7//! 
8//! ## Features
9//! 
10//! - **Layer Extraction**: Fast and reliable layer information parsing from PCB files
11//! - **Symbol Parsing**: Complete symbol library parsing with metadata
12//! - **Robust Error Handling**: Detailed error messages with context
13//! - **Memory Efficient**: Optimized for large files
14//! - **Well Tested**: Works with real-world KiCad files
15//! 
16//! ## Quick Start
17//! 
18//! ```rust
19//! use kiparse::prelude::*;
20//! 
21//! let pcb_content = r#"(kicad_pcb
22//!   (version "20240108")
23//!   (generator "pcbnew")
24//!   (layers
25//!     (0 "F.Cu" signal)
26//!     (31 "B.Cu" signal)
27//!   )
28//! )"#;
29//! 
30//! let pcb = parse_layers_only(pcb_content)?;
31//! 
32//! println!("Found {} layers", pcb.layers.len());
33//! for (id, layer) in &pcb.layers {
34//!     println!("Layer {}: {} ({})", id, layer.name, layer.layer_type);
35//! }
36//! # Ok::<(), Box<dyn std::error::Error>>(())
37//! ```
38//! 
39//! ## Module Organization
40//! 
41//! - [`pcb`] - PCB file layer extraction (.kicad_pcb)
42//! - [`symbol`] - Symbol library parsing (.kicad_sym) 
43//! - [`error`] - Error types and handling
44//! 
45//! ## Performance Characteristics
46//! 
47//! KiParse is designed for practical use with real PCB files:
48//! 
49//! - **Layer extraction**: ~10MB/s
50//! - **Symbol parsing**: ~15MB/s
51//! - **Memory usage**: ~1.5x file size during parsing
52
53pub mod pcb;
54pub mod symbol;
55pub mod error;
56pub mod prelude;
57
58// Re-export commonly used types at the crate root
59pub use error::{KicadError, Result};
60
61// Re-export the main parsing functions for convenience
62pub use pcb::parse_layers_only;
63pub use pcb::detail_parser::DetailParser;
64pub use symbol::symbol_parser::parse_symbol_lib;
65
66// Re-export PCB data types with module prefix to avoid conflicts
67pub use pcb::types::{
68    PcbFile, Layer, Track, Footprint, Pad, Via, Zone, Text, Graphic,
69    Point, Rect, Arc
70};
71
72// Re-export Symbol types with explicit naming to avoid conflicts
73pub use symbol::types::Symbol;
74
75/// Library version information
76pub const VERSION: &str = env!("CARGO_PKG_VERSION");
77
78/// Returns version information for the library
79pub fn version() -> &'static str {
80    VERSION
81}
82
83#[cfg(test)]
84mod integration_tests {
85    use super::*;
86    
87    #[test]
88    fn test_version() {
89        assert!(!version().is_empty());
90    }
91}