use crate::seqloc::{SeqId, SeqInterval, SeqLoc};
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
#[derive(Clone, Serialize_repr, Deserialize_repr, PartialEq, Debug)]
#[repr(u8)]
pub enum ColumnInfoFieldId {
Location,
LocationId,
LocationGi,
LocationFrom,
LocationTo,
LocationStrand,
LocationFuzzFromLim,
LocationFuzzToLim,
Product,
ProductId,
ProductGi,
ProductFrom,
ProductTo,
ProductStrand,
ProductFuzzFromLim,
ProductFuzzToLim,
IdLocal,
XrefIdLocal,
Partial,
Comment,
Title,
Ext,
Qual,
DbXref,
DataImpKey,
DataRegion,
DataCdregionFrame,
ExtType,
QualQual,
QualVal,
DbxrefDb,
DbxrefTag,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct SeqTableColumnInfo {
pub title: Option<String>,
pub field_id: Option<ColumnInfoFieldId>,
pub field_name: Option<String>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct CommonStringTable {
pub strings: Vec<String>,
pub indexes: Vec<usize>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct CommonBytesTable {
pub bytes: Vec<Vec<u8>>,
pub indexes: Vec<usize>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct ScaledIntMultiData {
pub mul: i32,
pub add: i32,
pub data: SeqTableMultiData,
pub min: Option<i32>,
pub max: Option<i32>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct ScaledRealMultiData {
pub mul: f64,
pub add: f64,
pub data: Box<SeqTableMultiData>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct BVectorData {
pub size: u64,
pub data: Vec<u8>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub enum SeqTableMultiData {
Int(Vec<u32>),
Real(Vec<f64>),
String(Vec<String>),
Bytes(Vec<Vec<u8>>),
CommonString(CommonStringTable),
CommonBytes(CommonBytesTable),
Bit(Vec<u8>),
Loc(Vec<SeqLoc>),
Id(Vec<SeqId>),
Interval(Vec<SeqInterval>),
IntDelta(Box<SeqTableMultiData>),
IntScaled(Box<ScaledIntMultiData>),
RealScaled(ScaledRealMultiData),
BitVector(BVectorData),
#[serde(rename = "int1")]
Int1(Vec<u8>),
#[serde(rename = "int2")]
Int2(Vec<u16>),
#[serde(rename = "int3")]
Int8(Vec<u64>),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum SeqTableSingleData {
Int(u64),
Real(f64),
String(String),
Bytes(Vec<u8>),
Bit(bool),
Loc(SeqLoc),
Id(SeqId),
Interval(SeqInterval),
Int8(u8),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub enum SeqTableSparseIndex {
Indexes(Vec<u64>),
BitSet(Vec<u8>),
IndexesDelta(Vec<u64>),
BitSetBvector(BVectorData),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct SeqTableColumn {
pub header: SeqTableColumnInfo,
pub data: Option<SeqTableMultiData>,
pub sparse: Option<SeqTableSparseIndex>,
pub default: Option<SeqTableSingleData>,
pub sparse_other: Option<SeqTableSingleData>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct SeqTable {
pub feat_type: usize,
pub feat_subtype: Option<usize>,
pub num_rows: u64,
pub columns: Vec<SeqTableColumn>,
}