pub struct Parser<'a> { /* private fields */ }Expand description
Parser for schema files.
Implementations§
Source§impl<'a> Parser<'a>
impl<'a> Parser<'a>
Sourcepub fn new(tokens: &'a [Token], source: &'a str) -> Self
pub fn new(tokens: &'a [Token], source: &'a str) -> Self
Creates a new parser from a token slice and the original source text.
Examples found in repository?
examples/visitor_demo.rs (line 365)
351fn main() -> Result<()> {
352 println!("=== Nautilus Schema Visitor Pattern Demo ===\n");
353
354 // Parse the schema
355 let mut lexer = Lexer::new(SCHEMA);
356 let mut tokens = Vec::new();
357 loop {
358 let token = lexer.next_token()?;
359 if matches!(token.kind, nautilus_schema::TokenKind::Eof) {
360 tokens.push(token);
361 break;
362 }
363 tokens.push(token);
364 }
365 let schema = Parser::new(&tokens, SCHEMA).parse_schema()?;
366
367 println!(
368 "Parsed schema with {} declarations\n",
369 schema.declarations.len()
370 );
371 let separator = "=".repeat(60);
372 println!("{}", separator);
373
374 // Visitor 1: Collect statistics
375 println!("\n1️⃣ Schema Statistics\n");
376 let mut stats = SchemaStats::default();
377 stats.visit_schema(&schema)?;
378 println!("{:#?}", stats);
379
380 println!("\n{}", separator);
381
382 // Visitor 2: Build relationship graph
383 println!("\n2️⃣ Relationship Analysis\n");
384 let mut graph = RelationshipGraph::default();
385 graph.visit_schema(&schema)?;
386 graph.print();
387
388 println!("\n{}", separator);
389
390 // Visitor 3: Find default values
391 println!("\n3️⃣ Default Values\n");
392 let mut defaults = DefaultValueCollector::default();
393 defaults.visit_schema(&schema)?;
394 for (field, default) in &defaults.defaults {
395 println!(" {} = {}", field, default);
396 }
397
398 println!("\n{}", separator);
399
400 // Visitor 4: Validate naming conventions
401 println!("\n4️⃣ Naming Convention Validation\n");
402 let mut validator = NamingValidator::new();
403 validator.visit_schema(&schema)?;
404 if validator.errors.is_empty() {
405 println!(" ✅ All names follow conventions!");
406 } else {
407 println!(" ⚠️ Found {} naming issues:", validator.errors.len());
408 for error in &validator.errors {
409 println!(" - {}", error);
410 }
411 }
412
413 println!("\n{}", separator);
414
415 // Visitor 5: Determine migration order
416 println!("\n5️⃣ Migration Planning\n");
417 let mut orderer = MigrationOrderer::default();
418 orderer.visit_schema(&schema)?;
419 orderer.print();
420
421 println!("\n{}", separator);
422 println!("\n✅ Visitor demo completed successfully!");
423
424 Ok(())
425}Sourcepub fn take_errors(&mut self) -> Vec<SchemaError>
pub fn take_errors(&mut self) -> Vec<SchemaError>
Returns all errors that were silently recovered from during parsing.
These are non-fatal: the parser managed to continue past them by
skipping to the next top-level declaration. Call this after
[parse_schema] to collect the full set of parse diagnostics.
Sourcepub fn parse_schema(&mut self) -> Result<Schema>
pub fn parse_schema(&mut self) -> Result<Schema>
Parses a complete schema.
Examples found in repository?
examples/visitor_demo.rs (line 365)
351fn main() -> Result<()> {
352 println!("=== Nautilus Schema Visitor Pattern Demo ===\n");
353
354 // Parse the schema
355 let mut lexer = Lexer::new(SCHEMA);
356 let mut tokens = Vec::new();
357 loop {
358 let token = lexer.next_token()?;
359 if matches!(token.kind, nautilus_schema::TokenKind::Eof) {
360 tokens.push(token);
361 break;
362 }
363 tokens.push(token);
364 }
365 let schema = Parser::new(&tokens, SCHEMA).parse_schema()?;
366
367 println!(
368 "Parsed schema with {} declarations\n",
369 schema.declarations.len()
370 );
371 let separator = "=".repeat(60);
372 println!("{}", separator);
373
374 // Visitor 1: Collect statistics
375 println!("\n1️⃣ Schema Statistics\n");
376 let mut stats = SchemaStats::default();
377 stats.visit_schema(&schema)?;
378 println!("{:#?}", stats);
379
380 println!("\n{}", separator);
381
382 // Visitor 2: Build relationship graph
383 println!("\n2️⃣ Relationship Analysis\n");
384 let mut graph = RelationshipGraph::default();
385 graph.visit_schema(&schema)?;
386 graph.print();
387
388 println!("\n{}", separator);
389
390 // Visitor 3: Find default values
391 println!("\n3️⃣ Default Values\n");
392 let mut defaults = DefaultValueCollector::default();
393 defaults.visit_schema(&schema)?;
394 for (field, default) in &defaults.defaults {
395 println!(" {} = {}", field, default);
396 }
397
398 println!("\n{}", separator);
399
400 // Visitor 4: Validate naming conventions
401 println!("\n4️⃣ Naming Convention Validation\n");
402 let mut validator = NamingValidator::new();
403 validator.visit_schema(&schema)?;
404 if validator.errors.is_empty() {
405 println!(" ✅ All names follow conventions!");
406 } else {
407 println!(" ⚠️ Found {} naming issues:", validator.errors.len());
408 for error in &validator.errors {
409 println!(" - {}", error);
410 }
411 }
412
413 println!("\n{}", separator);
414
415 // Visitor 5: Determine migration order
416 println!("\n5️⃣ Migration Planning\n");
417 let mut orderer = MigrationOrderer::default();
418 orderer.visit_schema(&schema)?;
419 orderer.print();
420
421 println!("\n{}", separator);
422 println!("\n✅ Visitor demo completed successfully!");
423
424 Ok(())
425}Auto Trait Implementations§
impl<'a> Freeze for Parser<'a>
impl<'a> RefUnwindSafe for Parser<'a>
impl<'a> Send for Parser<'a>
impl<'a> Sync for Parser<'a>
impl<'a> Unpin for Parser<'a>
impl<'a> UnsafeUnpin for Parser<'a>
impl<'a> UnwindSafe for Parser<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more