1use rusqlite::{
2 ToSql,
3 types::{FromSql, FromSqlResult, ToSqlOutput, Value, ValueRef},
4};
5use serde::{Deserialize, Serialize};
6
7use crate::gen_models_capnp;
8
9#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Deserialize, Serialize)]
10pub enum FileTypes {
11 GenBank,
12 Fasta,
13 GFA,
14 GAF,
15 VCF,
16 Changeset,
17 CSV,
18 Gff3,
19 Bed,
20 Tabix,
21 None,
22}
23
24impl ToSql for FileTypes {
25 fn to_sql(&self) -> rusqlite::Result<ToSqlOutput<'_>> {
26 let result = match self {
27 FileTypes::GenBank => "gb".into(),
28 FileTypes::Fasta => "fasta".into(),
29 FileTypes::GFA => "gfa".into(),
30 FileTypes::VCF => "vcf".into(),
31 FileTypes::Changeset => "changeset".into(),
32 FileTypes::CSV => "csv".into(),
33 FileTypes::GAF => "gaf".into(),
34 FileTypes::Gff3 => "gff3".into(),
35 FileTypes::Bed => "bed".into(),
36 FileTypes::Tabix => "tabix".into(),
37 FileTypes::None => "none".into(),
38 };
39 Ok(result)
40 }
41}
42
43impl From<FileTypes> for Value {
44 fn from(value: FileTypes) -> Value {
45 let result = match value {
46 FileTypes::GenBank => "gb",
47 FileTypes::Fasta => "fasta",
48 FileTypes::GFA => "gfa",
49 FileTypes::VCF => "vcf",
50 FileTypes::Changeset => "changeset",
51 FileTypes::CSV => "csv",
52 FileTypes::GAF => "gaf",
53 FileTypes::Gff3 => "gff3",
54 FileTypes::Bed => "bed",
55 FileTypes::Tabix => "tabix",
56 FileTypes::None => "none",
57 };
58 Value::Text(result.to_string())
59 }
60}
61
62impl FromSql for FileTypes {
63 fn column_result(value: ValueRef) -> FromSqlResult<Self> {
64 let result = match value.as_str() {
65 Ok("gb") => FileTypes::GenBank,
66 Ok("fasta") => FileTypes::Fasta,
67 Ok("gfa") => FileTypes::GFA,
68 Ok("vcf") => FileTypes::VCF,
69 Ok("changeset") => FileTypes::Changeset,
70 Ok("csv") => FileTypes::CSV,
71 Ok("gaf") => FileTypes::GAF,
72 Ok("gff3") => FileTypes::Gff3,
73 Ok("bed") => FileTypes::Bed,
74 Ok("tabix") => FileTypes::Tabix,
75 Ok("none") => FileTypes::None,
76 _ => panic!("Invalid entry in database"),
77 };
78 Ok(result)
79 }
80}
81impl From<FileTypes> for gen_models_capnp::FileType {
82 fn from(value: FileTypes) -> gen_models_capnp::FileType {
83 match value {
84 FileTypes::GenBank => gen_models_capnp::FileType::GenBank,
85 FileTypes::Fasta => gen_models_capnp::FileType::Fasta,
86 FileTypes::GFA => gen_models_capnp::FileType::Gfa,
87 FileTypes::GAF => gen_models_capnp::FileType::Gaf,
88 FileTypes::VCF => gen_models_capnp::FileType::Vcf,
89 FileTypes::Changeset => gen_models_capnp::FileType::Changeset,
90 FileTypes::CSV => gen_models_capnp::FileType::Csv,
91 FileTypes::Gff3 => gen_models_capnp::FileType::Gff3,
92 FileTypes::Bed => gen_models_capnp::FileType::Bed,
93 FileTypes::Tabix => gen_models_capnp::FileType::Tabix,
94 FileTypes::None => gen_models_capnp::FileType::None,
95 }
96 }
97}
98
99impl From<gen_models_capnp::FileType> for FileTypes {
100 fn from(value: gen_models_capnp::FileType) -> FileTypes {
101 match value {
102 gen_models_capnp::FileType::GenBank => FileTypes::GenBank,
103 gen_models_capnp::FileType::Fasta => FileTypes::Fasta,
104 gen_models_capnp::FileType::Gfa => FileTypes::GFA,
105 gen_models_capnp::FileType::Gaf => FileTypes::GAF,
106 gen_models_capnp::FileType::Vcf => FileTypes::VCF,
107 gen_models_capnp::FileType::Changeset => FileTypes::Changeset,
108 gen_models_capnp::FileType::Csv => FileTypes::CSV,
109 gen_models_capnp::FileType::Gff3 => FileTypes::Gff3,
110 gen_models_capnp::FileType::Bed => FileTypes::Bed,
111 gen_models_capnp::FileType::Tabix => FileTypes::Tabix,
112 gen_models_capnp::FileType::None => FileTypes::None,
113 }
114 }
115}
116
117impl FileTypes {
118 pub fn suffix(file_type: FileTypes) -> String {
119 let result = match file_type {
120 FileTypes::GenBank => "gb",
121 FileTypes::Fasta => "fa",
122 FileTypes::GFA => "gfa",
123 FileTypes::VCF => "vcf",
124 FileTypes::Changeset => "cs",
125 FileTypes::CSV => "csv",
126 FileTypes::GAF => "gaf",
127 FileTypes::Gff3 => "gff3",
128 FileTypes::Bed => "bed",
129 FileTypes::Tabix => "tbi",
130 FileTypes::None => "none",
131 };
132
133 result.to_string()
134 }
135}