29个版本

0.2.17 2023年12月6日
0.2.16 2023年11月29日
0.1.96 2023年11月28日
0.1.88 2023年9月20日
0.1.55 2023年6月25日

#1015 in 解析器实现

MIT 许可证

33KB
576

Crate用于获取关于考试结果快速易读的统计数据和比较

您可以从文件创建一个Exam对象。目前支持的文件格式只有JSONTOML文件。

示例

use std::error::Error;
use std::path::Path;

use exms::error::ParseError;
use exms::exam::Exam;

fn main() -> Result<(), ParseError> {
    let file_path = Path::new("students.toml");
    let exam = Exam::from_file(&file_path)?;

    Ok(())
}

从文件解析

您要解析的每个文件都应该遵循以下格式:它必须包含一个名为students的字段,其中包含每个学生的键/值对,键是学生的姓名,值是学生的成绩。学生的姓名应该是字符串,成绩是数字。

文件还可以包含一个可选字段,名为details。此字段的当前可能选项包括

  • max_grade(数字):考试的最高可能成绩。如果没有提供值,则默认最高成绩为10。
  • name(字符串):考试的名称。如果没有提供值,则使用文件名作为名称。

以下是一些有效文件的示例

JSON

{
    "details": {
        "name": "Exam 1",
        "max_grade": 10
    },

    "students": {
        "Abad Martinez, Jose": 4.89,
        "Acevedo Fuenzalida, Ignacio Joaquin": 5.79,
        "Alba Gisbert, Diego": 7.11,
        "Alcántara Campillo, Irene": 4.41,
    }
}

TOML

[details] # This field is optional
name = "Exam 1"
max_grade = 10

[students]
"Abad Martinez, Jose" = 4.89
"Acevedo Fuenzalida, Ignacio Joaquin" = 5.79
"Alba Gisbert, Diego" = 7.11
"Alcántara Campillo, Irene" = 4.41

解析其他文件格式

或者,您可以使用自己的解析逻辑来解析任何您想要解析的文件,将文件内容解析到Vec<Student>中,并使用Exam::new()函数创建一个新的Exam对象。

use std::error::Error;
use std::path::Path;

use exms::exam::{Exam, Student};

fn main() -> Result<(), Box<dyn Error>> {
    let file_path = Path::new("my_file");

    // Here you should parse your file into a Vec<Student>
    let students: Vec<Student> = parse_file(&file_path)?;
    let exam = Exam::new(students);

    Ok(())
}

依赖项

~6–17MB
~193K SLoC