1
0
Fork 0
mirror of https://github.com/xqtc161/meowlog.git synced 2025-02-23 06:17:52 +01:00

Parser for drugs.json

This commit is contained in:
xqtc 2024-10-14 22:31:12 +02:00
parent c26f70a52f
commit 212dbdb313
4 changed files with 905 additions and 0 deletions

View file

@ -0,0 +1,271 @@
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
mod parser;
pub fn parse() {
let file = include_str!("../../../drugs.json");
let db: DrugDatabase = serde_json::from_str(file).unwrap();
println!("{:?}", db);
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DrugDatabase(HashMap<String, Drug>);
#[derive(Serialize, Deserialize, Debug)]
pub struct Drug {
pub aliases: Option<Vec<String>>,
pub categories: Option<Vec<Category>>,
#[serde(rename = "formatted_aftereffects")]
pub formatted_aftereffects: Option<Duration>,
#[serde(rename = "formatted_dose")]
pub formatted_dose: Option<Dose>,
#[serde(rename = "formatted_duration")]
pub formatted_duration: Option<Duration>,
#[serde(rename = "formatted_effects")]
pub formatted_effects: Option<Vec<String>>,
#[serde(rename = "formatted_onset")]
pub formatted_onset: Option<Duration>,
pub links: Option<Links>,
pub name: String,
#[serde(rename = "pretty_name")]
pub pretty_name: String,
pub properties: Properties,
pub pweffects: Option<HashMap<String, String>>,
#[serde(rename = "dose_note")]
pub dose_note: Option<String>,
pub sources: Option<Sources>,
pub combos: Option<Combos>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub enum Category {
Depressant,
HabitForming,
Tentative,
ResearchChemical,
Psychedelic,
Stimulant,
Dissociative,
Inactive,
Empathogen,
Common,
Benzodiazepine,
Opioid,
Supplement,
Nootropic,
Barbiturate,
Deliriant,
Ssri,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Dose {
pub oral: Option<Dosage>,
pub insufflated: Option<Dosage>,
pub rectal: Option<Dosage>,
pub vapourized: Option<Dosage>,
pub intravenous: Option<Dosage>,
pub smoked: Option<Dosage>,
pub sublingual: Option<Dosage>,
pub buccal: Option<Dosage>,
pub intramuscular: Option<Dosage>,
pub transdermal: Option<Dosage>,
pub hbwr: Option<Dosage>,
#[serde(rename = "Morning_Glory")]
pub morning_glory: Option<Dosage>,
pub dried: Option<Dosage>,
pub fresh: Option<Dosage>,
#[serde(rename = "Insufflated(Pure)")]
pub insufflated_pure: Option<Dosage>,
#[serde(rename = "Oral(Benzedrex)")]
pub oral_benzedrex: Option<Dosage>,
#[serde(rename = "Oral(Pure)")]
pub oral_pure: Option<Dosage>,
pub dry: Option<Dosage>,
pub wet: Option<Dosage>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Dosage {
pub common: Option<String>,
pub light: Option<String>,
pub strong: Option<String>,
pub threshold: Option<String>,
pub heavy: Option<String>,
pub dangerous: Option<String>,
pub fatal: Option<String>,
pub note: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Duration {
#[serde(rename = "_unit")]
pub unit: Option<Unit>,
pub value: Option<String>,
pub insufflated: Option<String>,
pub oral: Option<String>,
pub rectal: Option<String>,
pub vapourized: Option<String>,
pub smoked: Option<String>,
#[serde(rename = "Oral_ER")]
pub oral_er: Option<String>,
#[serde(rename = "Oral_IR")]
pub oral_ir: Option<String>,
pub intramuscular: Option<String>,
pub intravenous: Option<String>,
pub metabolites: Option<String>,
pub parent: Option<String>,
#[serde(rename = "Oral_MAOI")]
pub oral_maoi: Option<String>,
pub buccal: Option<String>,
pub transdermal: Option<String>,
pub sublingual: Option<String>,
#[serde(rename = "Insufflated_IR")]
pub insufflated_ir: Option<String>,
#[serde(rename = "Insufflated_XR")]
pub insufflated_xr: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Links {
pub experiences: String,
pub pihkal: Option<String>,
pub tihkal: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Properties {
#[serde(rename = "after-effects")]
pub after_effects: Option<String>,
pub aliases: Option<Vec<String>>,
pub avoid: Option<String>,
pub categories: Option<Vec<Category>>,
pub dose: Option<String>,
pub duration: Option<String>,
#[serde(rename = "half-life")]
pub half_life: Option<String>,
pub onset: Option<String>,
pub summary: Option<String>,
#[serde(rename = "test-kits")]
pub test_kits: Option<String>,
pub experiences: Option<String>,
pub warning: Option<String>,
pub marquis: Option<String>,
pub effects: Option<String>,
pub risks: Option<String>,
pub comeup: Option<String>,
pub note: Option<String>,
pub detection: Option<String>,
pub wiki: Option<String>,
pub mdma: Option<String>,
pub tolerance: Option<String>,
pub bioavailability: Option<String>,
#[serde(rename = "dose_to_diazepam")]
pub dose_to_diazepam: Option<String>,
#[serde(rename = "adverse-effects")]
pub adverse_effects: Option<String>,
pub chemistry: Option<String>,
pub contraindications: Option<String>,
pub legal: Option<String>,
#[serde(rename = "overdose-symptoms")]
pub overdose_symptoms: Option<String>,
pub pharmacokinetics: Option<String>,
pub pharmacology: Option<String>,
pub obtain: Option<String>,
pub pharmacodynamics: Option<String>,
#[serde(rename = "side-effects")]
pub side_effects: Option<String>,
pub molecule: Option<String>,
pub vaporization: Option<String>,
pub calculator: Option<String>,
pub chart: Option<String>,
pub oral: Option<String>,
#[serde(rename = "general-advice")]
pub general_advice: Option<String>,
pub potentiators: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Combos {
#[serde(rename = "2c-t-x")]
pub c2_t_x: Option<Combo>,
#[serde(rename = "2c-x")]
pub c2_x: Option<Combo>,
#[serde(rename = "5-meo-xxt")]
pub c5_meo_xxt: Option<Combo>,
pub alcohol: Option<Combo>,
pub amphetamines: Option<Combo>,
pub amt: Option<Combo>,
pub benzodiazepines: Option<Combo>,
pub caffeine: Option<Combo>,
pub cannabis: Option<Combo>,
pub cocaine: Option<Combo>,
pub dextromethorphan: Option<Combo>,
pub diphenhydramine: Option<Combo>,
pub dmt: Option<Combo>,
pub dox: Option<Combo>,
#[serde(rename = "ghb/gbl")]
pub ghb_gbl: Option<Combo>,
pub lithium: Option<Combo>,
pub ketamine: Option<Combo>,
pub lsd: Option<Combo>,
pub maois: Option<Combo>,
pub mdma: Option<Combo>,
pub mephedrone: Option<Combo>,
pub mescaline: Option<Combo>,
pub mushrooms: Option<Combo>,
pub mxe: Option<Combo>,
pub nbomes: Option<Combo>,
pub nitrous: Option<Combo>,
pub opioids: Option<Combo>,
pub pcp: Option<Combo>,
pub ssris: Option<Combo>,
pub tramadol: Option<Combo>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Combo {
pub sources: Option<Vec<SourceData>>,
pub note: Option<String>,
pub status: Status,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct SourceData {
pub author: Option<String>,
pub title: Option<String>,
pub url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub enum Status {
#[serde(rename = "Low Risk & Decrease")]
LowRiskAndDecrease,
Dangerous,
#[serde(rename = "Low Risk & No Synergy")]
LowRiskAndNoSynergy,
Caution,
Unsafe,
#[serde(rename = "Low Risk & Synergy")]
LowRiskAndSynergy,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub enum Unit {
Hours,
Minutes,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Sources {
#[serde(rename = "_general")]
pub general: Option<Vec<String>>,
pub dose: Option<Vec<String>>,
pub duration: Option<Vec<String>>,
pub bioavailability: Option<Vec<String>>,
pub legality: Option<Vec<String>>,
pub onset: Option<Vec<String>>,
}
// ssh NZrVk5tjc7aJVHbDmzwVbcNtZ@lon1.tmate.io

View file

@ -0,0 +1,7 @@
use bincode;
use serde_json;
pub fn parse() -> Result<(), std::io::Error> {
let drugs = std::fs::read("drugs.json").unwrap();
Ok(())
}

View file

@ -15,6 +15,8 @@ lazy_static! {
}
mod util;
mod drugs_parser;
mod ingestions;
mod ingestions_util;
mod substance_util;
@ -72,6 +74,7 @@ fn print_completions<G: Generator>(gen: G, cmd: &mut Command) {
}
fn main() {
drugs_parser::parse();
ensure_files();
let cli = Cli::parse();

624
drug_schema.json Normal file
View file

@ -0,0 +1,624 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/Drug"
},
"definitions": {
"Drug": {
"type": "object",
"additionalProperties": false,
"properties": {
"aliases": {
"type": "array",
"items": {
"type": "string"
}
},
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/Category"
}
},
"formatted_aftereffects": {
"$ref": "#/definitions/Duration"
},
"formatted_dose": {
"$ref": "#/definitions/Dose"
},
"formatted_duration": {
"$ref": "#/definitions/Duration"
},
"formatted_effects": {
"type": "array",
"items": {
"type": "string"
}
},
"formatted_onset": {
"$ref": "#/definitions/Duration"
},
"links": {
"$ref": "#/definitions/Links"
},
"name": {
"type": "string"
},
"pretty_name": {
"type": "string"
},
"properties": {
"$ref": "#/definitions/Properties"
},
"pweffects": {
"type": "object",
"additionalProperties": {
"type": "string",
"format": "uri"
}
},
"dose_note": {
"type": "string"
},
"sources": {
"$ref": "#/definitions/Sources"
},
"combos": {
"type": "object",
"properties": {
"2c-t-x": {
"$ref": "#/definitions/Combo"
},
"2c-x": {
"$ref": "#/definitions/Combo"
},
"5-meo-xxt": {
"$ref": "#/definitions/Combo"
},
"alcohol": {
"$ref": "#/definitions/Combo"
},
"amphetamines": {
"$ref": "#/definitions/Combo"
},
"amt": {
"$ref": "#/definitions/Combo"
},
"benzodiazepines": {
"$ref": "#/definitions/Combo"
},
"caffeine": {
"$ref": "#/definitions/Combo"
},
"cannabis": {
"$ref": "#/definitions/Combo"
},
"cocaine": {
"$ref": "#/definitions/Combo"
},
"dextromethorphan": {
"$ref": "#/definitions/Combo"
},
"diphenhydramine": {
"$ref": "#/definitions/Combo"
},
"dmt": {
"$ref": "#/definitions/Combo"
},
"dox": {
"$ref": "#/definitions/Combo"
},
"ghb/gbl": {
"$ref": "#/definitions/Combo"
},
"lithium": {
"$ref": "#/definitions/Combo"
},
"ketamine": {
"$ref": "#/definitions/Combo"
},
"lsd": {
"$ref": "#/definitions/Combo"
},
"maois": {
"$ref": "#/definitions/Combo"
},
"mdma": {
"$ref": "#/definitions/Combo"
},
"mephedrone": {
"$ref": "#/definitions/Combo"
},
"mescaline": {
"$ref": "#/definitions/Combo"
},
"mushrooms": {
"$ref": "#/definitions/Combo"
},
"mxe": {
"$ref": "#/definitions/Combo"
},
"nbomes": {
"$ref": "#/definitions/Combo"
},
"nitrous": {
"$ref": "#/definitions/Combo"
},
"opioids": {
"$ref": "#/definitions/Combo"
},
"pcp": {
"$ref": "#/definitions/Combo"
},
"ssris": {
"$ref": "#/definitions/Combo"
},
"tramadol": {
"$ref": "#/definitions/Combo"
}
},
"additionalProperties": false
}
},
"required": [
"name",
"pretty_name",
"properties"
],
"title": "Drug"
},
"Category": {
"type": "string",
"enum": [
"depressant",
"habit-forming",
"tentative",
"research-chemical",
"psychedelic",
"stimulant",
"dissociative",
"inactive",
"empathogen",
"common",
"benzodiazepine",
"opioid",
"supplement",
"nootropic",
"barbiturate",
"deliriant",
"ssri"
],
"title": "Category"
},
"Dose": {
"type": "object",
"additionalProperties": false,
"properties": {
"Oral": {
"$ref": "#/definitions/Dosage"
},
"Insufflated": {
"$ref": "#/definitions/Dosage"
},
"Rectal": {
"$ref": "#/definitions/Dosage"
},
"Vapourized": {
"$ref": "#/definitions/Dosage"
},
"Intravenous": {
"$ref": "#/definitions/Dosage"
},
"Smoked": {
"$ref": "#/definitions/Dosage"
},
"Sublingual": {
"$ref": "#/definitions/Dosage"
},
"Buccal": {
"$ref": "#/definitions/Dosage"
},
"Intramuscular": {
"$ref": "#/definitions/Dosage"
},
"Transdermal": {
"$ref": "#/definitions/Dosage"
},
"HBWR": {
"$ref": "#/definitions/Dosage"
},
"Morning_Glory": {
"$ref": "#/definitions/Dosage"
},
"Dried": {
"$ref": "#/definitions/Dosage"
},
"Fresh": {
"$ref": "#/definitions/Dosage"
},
"Insufflated(Pure)": {
"$ref": "#/definitions/Dosage"
},
"Oral(Benzedrex)": {
"$ref": "#/definitions/Dosage"
},
"Oral(Pure)": {
"$ref": "#/definitions/Dosage"
},
"Dry": {
"$ref": "#/definitions/Dosage"
},
"Wet": {
"$ref": "#/definitions/Dosage"
}
},
"required": [],
"title": "FormattedDose"
},
"Dosage": {
"type": "object",
"additionalProperties": false,
"properties": {
"Common": {
"type": "string"
},
"Light": {
"type": "string"
},
"Strong": {
"type": "string"
},
"Threshold": {
"type": "string"
},
"Heavy": {
"type": "string"
},
"Dangerous": {
"type": "string"
},
"Fatal": {
"type": "string"
},
"Note": {
"type": "string"
}
},
"required": [],
"title": "Buccal"
},
"Duration": {
"type": "object",
"additionalProperties": false,
"properties": {
"_unit": {
"$ref": "#/definitions/Unit"
},
"value": {
"type": "string"
},
"Insufflated": {
"type": "string"
},
"Oral": {
"type": "string"
},
"Rectal": {
"type": "string"
},
"Vapourized": {
"type": "string"
},
"Smoked": {
"type": "string"
},
"Oral_ER": {
"type": "string"
},
"Oral_IR": {
"type": "string"
},
"Intramuscular": {
"type": "string"
},
"Intravenous": {
"type": "string"
},
"Metabolites": {
"type": "string"
},
"Parent": {
"type": "string"
},
"Oral_MAOI": {
"type": "string"
},
"Buccal": {
"type": "string"
},
"Transdermal": {
"type": "string"
},
"Sublingual": {
"type": "string"
},
"Insufflated_IR": {
"type": "string"
},
"Insufflated_XR": {
"type": "string"
}
},
"required": [],
"title": "Formatted"
},
"Links": {
"type": "object",
"additionalProperties": false,
"properties": {
"experiences": {
"type": "string",
"format": "uri"
},
"pihkal": {
"type": "string",
"format": "uri"
},
"tihkal": {
"type": "string",
"format": "uri"
}
},
"required": [
"experiences"
],
"title": "Links"
},
"Properties": {
"type": "object",
"additionalProperties": false,
"properties": {
"after-effects": {
"type": "string"
},
"aliases": {
"type": "array",
"items": {
"type": "string"
}
},
"avoid": {
"type": "string"
},
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/Category"
}
},
"dose": {
"type": "string"
},
"duration": {
"type": "string"
},
"half-life": {
"type": "string"
},
"onset": {
"type": "string"
},
"summary": {
"type": "string"
},
"test-kits": {
"type": "string"
},
"experiences": {
"type": "string",
"format": "uri"
},
"warning": {
"type": "string"
},
"marquis": {
"type": "string"
},
"effects": {
"type": "string"
},
"risks": {
"type": "string"
},
"comeup": {
"type": "string"
},
"note": {
"type": "string"
},
"detection": {
"type": "string"
},
"wiki": {
"type": "string",
"format": "uri"
},
"mdma": {
"type": "string"
},
"tolerance": {
"type": "string"
},
"bioavailability": {
"type": "string"
},
"dose_to_diazepam": {
"type": "string"
},
"adverse-effects": {
"type": "string"
},
"chemistry": {
"type": "string"
},
"contraindications": {
"type": "string"
},
"legal": {
"type": "string"
},
"overdose-symptoms": {
"type": "string"
},
"pharmacokinetics": {
"type": "string"
},
"pharmacology": {
"type": "string"
},
"obtain": {
"type": "string"
},
"pharmacodynamics": {
"type": "string"
},
"side-effects": {
"type": "string"
},
"molecule": {
"type": "string",
"format": "uri"
},
"vaporization": {
"type": "string"
},
"calculator": {
"type": "string",
"format": "uri"
},
"chart": {
"type": "string",
"format": "uri"
},
"Oral": {
"type": "string"
},
"general-advice": {
"type": "string"
},
"potentiators": {
"type": "string"
}
},
"required": [],
"title": "Properties"
},
"Combo": {
"type": "object",
"additionalProperties": false,
"properties": {
"sources": {
"type": "array",
"items": {
"$ref": "#/definitions/SourceData"
}
},
"note": {
"type": "string"
},
"status": {
"$ref": "#/definitions/Status"
}
},
"required": [
"status"
],
"title": "Combo"
},
"SourceData": {
"type": "object",
"additionalProperties": false,
"properties": {
"author": {
"type": "string"
},
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"title": "SourceData"
},
"Status": {
"type": "string",
"enum": [
"Low Risk & Decrease",
"Dangerous",
"Low Risk & No Synergy",
"Caution",
"Unsafe",
"Low Risk & Synergy"
],
"title": "Status"
},
"Unit": {
"type": "string",
"enum": [
"hours",
"minutes"
],
"title": "Unit"
},
"Sources": {
"type": "object",
"additionalProperties": false,
"properties": {
"_general": {
"type": "array",
"items": {
"type": "string"
}
},
"dose": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
},
"duration": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
},
"bioavailability": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
},
"legality": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
},
"onset": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [],
"title": "Sources"
}
}
}