bookdata/openlib/
subject.rs

1/// Recording OpenLibrary subjects and subject-entity links.
2use num_enum::{IntoPrimitive, TryFromPrimitive};
3use parse_display::*;
4
5use super::source::OLSubjects;
6
7/// The type of a subject relationship.
8#[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/// Schema for subject linking records.
19#[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}