diff --git a/lib_tsalign/src/a_star_aligner/alignment_geometry.rs b/lib_tsalign/src/a_star_aligner/alignment_geometry.rs index 6680bb9..e50b6a8 100644 --- a/lib_tsalign/src/a_star_aligner/alignment_geometry.rs +++ b/lib_tsalign/src/a_star_aligner/alignment_geometry.rs @@ -1,7 +1,7 @@ use std::{fmt::Display, ops::Range}; #[derive(Debug, Clone, Eq, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] pub struct AlignmentRange { offset: AlignmentCoordinates, @@ -9,7 +9,7 @@ pub struct AlignmentRange { } #[derive(Debug, Clone, Copy, Eq, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] pub struct AlignmentCoordinates { reference: usize, diff --git a/lib_tsalign/src/a_star_aligner/configurable_a_star_align.rs b/lib_tsalign/src/a_star_aligner/configurable_a_star_align.rs index c649af4..0c65830 100644 --- a/lib_tsalign/src/a_star_aligner/configurable_a_star_align.rs +++ b/lib_tsalign/src/a_star_aligner/configurable_a_star_align.rs @@ -53,7 +53,7 @@ pub use compact_genome::implementation::alphabets; pub use compact_genome::interface::alphabet::Alphabet; #[derive(Debug, Default)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] pub enum MinLengthStrategySelector { None, @@ -68,7 +68,7 @@ pub enum MinLengthStrategySelector { } #[derive(Debug, Default)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] pub enum ChainingStrategySelector { #[default] @@ -78,7 +78,7 @@ pub enum ChainingStrategySelector { } #[derive(Debug, Default)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] pub enum TotalLengthStrategySelector { None, @@ -97,10 +97,9 @@ struct QueryData<'a> { memory_limit: Option, } -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] // Mostly used for kwargs in python bindings -#[cfg_attr(feature = "serde", serde(default))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", serde(default, bound = ""))] pub struct Aligner { - #[cfg_attr(feature = "serde", serde(skip))] // Not deserializable costs: TemplateSwitchConfig, // ↓ Settings for how the alignment (definition) diff --git a/lib_tsalign/src/config.rs b/lib_tsalign/src/config.rs index d5df41b..319235e 100644 --- a/lib_tsalign/src/config.rs +++ b/lib_tsalign/src/config.rs @@ -13,6 +13,14 @@ use crate::{ pub mod io; #[derive(Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr( + feature = "serde", + serde(bound( + deserialize = "Cost: serde::Deserialize<'de>", // omit AlphabetType + serialize = "Cost: serde::Serialize" // omit AlphabetType + )) +)] pub struct TemplateSwitchConfig { // Limits pub left_flank_length: isize, @@ -39,6 +47,7 @@ pub struct TemplateSwitchConfig { pub reverse_anti_primary_gap_costs: CostFunction, } +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub struct BaseCost { /// Primary: reference; secondary: reference; direction: forward. diff --git a/lib_tsalign/src/costs/cost_function.rs b/lib_tsalign/src/costs/cost_function.rs index 2cf9ce0..50cf2d1 100644 --- a/lib_tsalign/src/costs/cost_function.rs +++ b/lib_tsalign/src/costs/cost_function.rs @@ -17,6 +17,7 @@ pub mod io; /// * `f(x) = 3` for `2 <= x`. /// /// The function can be evaluated via its [`evaluate`](Self::evaluate) function. +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[derive(Debug, Clone, Eq, PartialEq)] pub struct CostFunction { function: Vec<(SourceType, Cost)>, diff --git a/lib_tsalign/src/costs/gap_affine.rs b/lib_tsalign/src/costs/gap_affine.rs index dfd4f1b..60ad906 100644 --- a/lib_tsalign/src/costs/gap_affine.rs +++ b/lib_tsalign/src/costs/gap_affine.rs @@ -5,13 +5,27 @@ use generic_a_star::cost::AStarCost; pub mod io; +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr( + feature = "serde", + serde(bound( + deserialize = "Cost: serde::Deserialize<'de>", // omit AlphabetType + serialize = "Cost: serde::Serialize" // omit AlphabetType + )) +)] #[derive(Debug, Eq, PartialEq)] pub struct GapAffineAlignmentCostTable { name: String, substitution_cost_table: Vec, gap_open_cost_vector: Vec, gap_extend_cost_vector: Vec, - phantom_data: PhantomData, + + // Establish invariance over AlphabetType + // Because we don't actually store any data of type AlphabetType, + // we do not want to use PhantomData directly, + // for example so that AlphabetType does not need to be Send + Sync for + // this cost table to be Send + Sync. + phantom_data: PhantomData AlphabetType>, // Cache some values that are potentially used often. min_substitution_cost: Cost,