awk_rs/
lib.rs

1//! awk-rs - A 100% POSIX-compatible AWK implementation in Rust
2//!
3//! This crate provides a complete AWK interpreter that aims for full compatibility
4//! with POSIX AWK and GNU AWK extensions.
5//!
6//! # Example
7//!
8//! ```
9//! use awk_rs::{Lexer, Parser, Interpreter};
10//! use std::io::BufReader;
11//!
12//! // Parse an AWK program
13//! let source = r#"BEGIN { print "Hello, World!" }"#;
14//! let mut lexer = Lexer::new(source);
15//! let tokens = lexer.tokenize().unwrap();
16//! let mut parser = Parser::new(tokens);
17//! let program = parser.parse().unwrap();
18//!
19//! // Run the program
20//! let mut interpreter = Interpreter::new(&program);
21//! let mut output = Vec::new();
22//! let inputs: Vec<BufReader<&[u8]>> = vec![];
23//! interpreter.run(inputs, &mut output).unwrap();
24//!
25//! assert_eq!(String::from_utf8(output).unwrap(), "Hello, World!\n");
26//! ```
27//!
28//! # Field Processing Example
29//!
30//! ```
31//! use awk_rs::{Lexer, Parser, Interpreter};
32//! use std::io::BufReader;
33//!
34//! let source = r#"{ print $1, $2 }"#;
35//! let mut lexer = Lexer::new(source);
36//! let tokens = lexer.tokenize().unwrap();
37//! let mut parser = Parser::new(tokens);
38//! let program = parser.parse().unwrap();
39//!
40//! let mut interpreter = Interpreter::new(&program);
41//! interpreter.set_fs(",");  // Use comma as field separator
42//!
43//! let input = b"hello,world\nfoo,bar\n";
44//! let mut output = Vec::new();
45//! let inputs = vec![BufReader::new(&input[..])];
46//! interpreter.run(inputs, &mut output).unwrap();
47//!
48//! assert_eq!(String::from_utf8(output).unwrap(), "hello world\nfoo bar\n");
49//! ```
50//!
51//! # Pattern Matching Example
52//!
53//! ```
54//! use awk_rs::{Lexer, Parser, Interpreter};
55//! use std::io::BufReader;
56//!
57//! let source = r#"/error/ { print "Found:", $0 }"#;
58//! let mut lexer = Lexer::new(source);
59//! let tokens = lexer.tokenize().unwrap();
60//! let mut parser = Parser::new(tokens);
61//! let program = parser.parse().unwrap();
62//!
63//! let mut interpreter = Interpreter::new(&program);
64//! let input = b"info: ok\nerror: failed\ninfo: done\n";
65//! let mut output = Vec::new();
66//! let inputs = vec![BufReader::new(&input[..])];
67//! interpreter.run(inputs, &mut output).unwrap();
68//!
69//! assert_eq!(String::from_utf8(output).unwrap(), "Found: error: failed\n");
70//! ```
71
72pub mod ast;
73pub mod error;
74pub mod interpreter;
75pub mod lexer;
76pub mod parser;
77pub mod value;
78
79pub use error::{Error, Result, SourceLocation};
80pub use interpreter::Interpreter;
81pub use lexer::{Lexer, Token, TokenKind};
82pub use parser::Parser;
83pub use value::Value;