71 lines
2.0 KiB
Rust
71 lines
2.0 KiB
Rust
// Определяем типаж Parser
|
|
trait Parser {
|
|
fn parse(&self, input: &str) -> Result<String, String>;
|
|
}
|
|
|
|
|
|
|
|
// Парсер JSON
|
|
struct JsonParser;
|
|
|
|
impl Parser for JsonParser {
|
|
fn parse(&self, input: &str) -> Result<String, String> {
|
|
if input.trim().starts_with('{') && input.trim().ends_with('}') {
|
|
Ok("Parsed JSON".to_string())
|
|
} else {
|
|
Err("Invalid JSON format".to_string())
|
|
}
|
|
}
|
|
}
|
|
|
|
// Парсер CSV
|
|
struct CsvParser;
|
|
|
|
impl Parser for CsvParser {
|
|
fn parse(&self, input: &str) -> Result<String, String> {
|
|
if input.contains(',') {
|
|
Ok("Parsed CSV".to_string())
|
|
} else {
|
|
Err("Invalid CSV format".to_string())
|
|
}
|
|
}
|
|
}
|
|
|
|
// Функция для обработки данных парсером
|
|
fn parse_data(parser: &dyn Parser, input: &str) -> Result<String, String> {
|
|
parser.parse(input)
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
// Пример использования JSON парсера
|
|
let json_parser = JsonParser;
|
|
let result = parse_data(&json_parser, r#"{ "name": "Alice" }"#);
|
|
println!("{:?}", result); // Ok("Parsed JSON")
|
|
|
|
// Пример использования CSV парсера
|
|
let csv_parser = CsvParser;
|
|
let result = parse_data(&csv_parser, "name,age,location");
|
|
println!("{:?}", result); // Ok("Parsed CSV")
|
|
|
|
// Пример обработки ошибок
|
|
let invalid_json = parse_data(&json_parser, "not a json");
|
|
println!("{:?}", invalid_json); // Err("Invalid JSON format")
|
|
|
|
let invalid_csv = parse_data(&csv_parser, "no commas here");
|
|
println!("{:?}", invalid_csv); // Err("Invalid CSV format")
|
|
|
|
// Динамический выбор парсера
|
|
let parsers: Vec<&dyn Parser> = vec![&json_parser, &csv_parser];
|
|
for parser in parsers {
|
|
println!("Testing parser:");
|
|
let test_input = if parser.parse("{").is_ok() {
|
|
r#"{ "test": "value" }"#
|
|
} else {
|
|
"field1,field2,field3"
|
|
};
|
|
println!("{:?}", parser.parse(test_input));
|
|
}
|
|
}
|