use mrrc::{Field, Leader, Record, RecordHelpers};
fn main() {
simple_record();
record_with_subjects();
complex_record();
}
fn default_leader() -> Leader {
Leader {
record_length: 0,
record_status: 'n',
record_type: 'a',
bibliographic_level: 'm',
control_record_type: ' ',
character_coding: ' ',
indicator_count: 2,
subfield_code_count: 2,
data_base_address: 0,
encoding_level: ' ',
cataloging_form: 'a',
multipart_level: ' ',
reserved: "4500".to_string(),
}
}
fn simple_record() {
println!("\n=== Simple Bibliographic Record ===\n");
let record = Record::builder(default_leader())
.control_field_str("001", "9780061120084")
.control_field_str("008", "051029s2005 xxu||||||||||||||||eng||")
.field(
Field::builder("245".to_string(), '1', '0')
.subfield_str('a', "To Kill a Mockingbird /")
.subfield_str('c', "Harper Lee.")
.build(),
)
.field(
Field::builder("100".to_string(), '1', ' ')
.subfield_str('a', "Lee, Harper,")
.subfield_str('d', "1926-2016,")
.subfield_str('e', "author.")
.build(),
)
.field(
Field::builder("650".to_string(), ' ', '0')
.subfield_str('a', "Psychological fiction.")
.build(),
)
.field(
Field::builder("650".to_string(), ' ', '0')
.subfield_str('a', "Legal stories.")
.build(),
)
.build();
println!("Record Type: {}", record.leader.record_type);
println!(
"Control Number: {}",
record.get_control_field("001").unwrap_or("N/A")
);
if let Some(title) = record.title() {
println!("Title: {title}");
}
if let Some(author) = record.author() {
println!("Author: {author}");
}
println!("Subjects:");
for subject in record.subjects() {
println!(" - {subject}");
}
}
fn record_with_subjects() {
println!("\n=== Record with Multiple Subjects ===\n");
let record = Record::builder(default_leader())
.control_field_str("001", "12345678")
.field(
Field::builder("245".to_string(), '1', '0')
.subfield_str('a', "Introduction to quantum mechanics")
.build(),
)
.field(
Field::builder("650".to_string(), ' ', '0')
.subfield_str('a', "Quantum mechanics")
.subfield_str('v', "Textbooks.")
.build(),
)
.field(
Field::builder("650".to_string(), ' ', '0')
.subfield_str('a', "Physics")
.subfield_str('x', "Study and teaching")
.subfield_str('z', "Higher.")
.build(),
)
.field(
Field::builder("650".to_string(), ' ', '0')
.subfield_str('a', "Quantum theory.")
.build(),
)
.build();
println!("Subjects with subdivisions:");
for field in record.fields_by_tag("650") {
if let Some(main) = field.get_subfield('a') {
println!(" Main: {main}");
if let Some(subdivision) = field.get_subfield('x') {
println!(" Topical subdivision: {subdivision}");
}
if let Some(subdivision) = field.get_subfield('z') {
println!(" Geographic subdivision: {subdivision}");
}
if let Some(form) = field.get_subfield('v') {
println!(" Form subdivision: {form}");
}
}
}
}
fn complex_record() {
println!("\n=== Complex Bibliographic Record ===\n");
let record = Record::builder(default_leader())
.control_field_str("001", "ocm00123456")
.control_field_str("005", "20051229123456.0")
.control_field_str("008", "051229s2005 xxu||||||||||||||||eng||")
.field(
Field::builder("100".to_string(), '1', ' ')
.subfield_str('a', "Doe, John,")
.subfield_str('d', "1950-")
.subfield_str('e', "author.")
.build(),
)
.field(
Field::builder("245".to_string(), '1', '4')
.subfield_str('a', "The guide to advanced Rust programming /")
.subfield_str('c', "John Doe.")
.build(),
)
.field(
Field::builder("260".to_string(), ' ', ' ')
.subfield_str('a', "New York :") .subfield_str('b', "O'Reilly Media,") .subfield_str('c', "2005.") .build(),
)
.field(
Field::builder("300".to_string(), ' ', ' ')
.subfield_str('a', "xix, 400 pages :") .subfield_str('b', "color illustrations ;") .subfield_str('c', "24 cm") .build(),
)
.field(
Field::builder("020".to_string(), ' ', ' ')
.subfield_str('a', "9780596004957")
.build(),
)
.field(
Field::builder("650".to_string(), ' ', '0')
.subfield_str('a', "Rust (Computer program language)")
.build(),
)
.field(
Field::builder("650".to_string(), ' ', '0')
.subfield_str('a', "Programming languages")
.subfield_str('x', "Handbooks, manuals, etc.")
.build(),
)
.field(
Field::builder("700".to_string(), '1', ' ')
.subfield_str('a', "Smith, Jane,")
.subfield_str('d', "1960-")
.subfield_str('e', "editor.")
.build(),
)
.build();
println!("Title: {}", record.title().unwrap_or("Unknown"));
println!("Author: {}", record.author().unwrap_or("Unknown"));
if let Some(publication) = record.publication_info() {
println!(
"Published: {} in {}",
publication.date.as_deref().unwrap_or("unknown date"),
publication.place.as_deref().unwrap_or("unknown place"),
);
if let Some(publisher) = &publication.publisher {
println!("Publisher: {publisher}");
}
}
println!("\nSubjects:");
for subject in record.subjects() {
println!(" {subject}");
}
println!("\nISBN:");
for isbn in record.isbns() {
println!(" {isbn}");
}
}