bookdata/openlib/
subject.rs1use num_enum::{IntoPrimitive, TryFromPrimitive};
3use parse_display::*;
4
5use super::source::OLSubjects;
6
7#[derive(Debug, Clone, FromStr, Display, IntoPrimitive, TryFromPrimitive)]
9#[display(style = "kebab-case")]
10#[repr(u8)]
11pub enum SubjectType {
12 General = b'G',
13 Person = b'P',
14 Place = b'L',
15 Time = b'T',
16}
17
18#[derive(Debug, Clone)]
20pub struct SubjectEntry {
21 pub entity: u32,
22 pub subj_type: SubjectType,
23 pub subject: String,
24}
25
26impl OLSubjects {
27 pub fn subject_records(self, entity: u32) -> Vec<SubjectEntry> {
28 let mut records = Vec::new();
29 for subject in self.subjects {
30 records.push(SubjectEntry {
31 entity,
32 subj_type: SubjectType::General,
33 subject: subject.into(),
34 });
35 }
36
37 for subject in self.subject_people {
38 records.push(SubjectEntry {
39 entity,
40 subj_type: SubjectType::Person,
41 subject: subject.into(),
42 });
43 }
44
45 for subject in self.subject_places {
46 records.push(SubjectEntry {
47 entity,
48 subj_type: SubjectType::Place,
49 subject: subject.into(),
50 });
51 }
52
53 for subject in self.subject_times {
54 records.push(SubjectEntry {
55 entity,
56 subj_type: SubjectType::Time,
57 subject: subject.into(),
58 });
59 }
60
61 records
62 }
63}