use crate::error::XcError;
use crate::families::XcEval;
use crate::func::FunctionalId;
mod attenuation;
mod gga_c_lyp;
mod gga_c_p86;
mod gga_c_pbe;
mod gga_c_pbe_sol;
mod gga_x_b88;
mod gga_x_pbe;
mod gga_x_pbe_r;
mod gga_x_pbe_sol;
mod gga_x_rpbe;
mod hyb_gga_xc_wb97x_v;
mod hyb_mgga_x_m06_2x;
mod hyb_mgga_xc_pw6b95;
mod hyb_mgga_xc_pwpb95;
mod hyb_mgga_xc_wb97m_2;
mod hyb_mgga_xc_wb97m_v;
mod hybrids;
mod lda_c_pw;
mod lda_c_vwn;
mod lda_c_vwn_3;
mod lda_c_vwn_rpa;
mod lda_x;
mod mgga_c_m06_2x;
mod mgga_c_m06_l;
mod mgga_c_r2scan;
mod mgga_c_tpss;
mod mgga_x_m06_l;
mod mgga_x_r2scan;
mod mgga_x_tpss;
mod mgga_xc_b97mv;
pub(crate) fn build(id: FunctionalId) -> Result<Box<dyn XcEval>, XcError> {
use FunctionalId::*;
match id {
LdaX => Ok(lda_x::LdaX::boxed()),
LdaCPw => Ok(lda_c_pw::LdaCPw::boxed()),
LdaCVwn => Ok(lda_c_vwn::LdaCVwn::boxed()),
LdaCVwn3 => Ok(lda_c_vwn_3::LdaCVwn3::boxed()),
LdaCVwnRpa => Ok(lda_c_vwn_rpa::LdaCVwnRpa::boxed()),
GgaXPbe => Ok(gga_x_pbe::GgaXPbe::boxed()),
GgaXB88 => Ok(gga_x_b88::GgaXB88::boxed()),
GgaCPbe => Ok(gga_c_pbe::GgaCPbe::boxed()),
GgaCLyp => Ok(gga_c_lyp::GgaCLyp::boxed()),
GgaXPbeR => Ok(gga_x_pbe_r::GgaXPbeR::boxed()),
GgaXPbeSol => Ok(gga_x_pbe_sol::GgaXPbeSol::boxed()),
GgaXRpbe => Ok(gga_x_rpbe::GgaXRpbe::boxed()),
GgaCPbeSol => Ok(gga_c_pbe_sol::GgaCPbeSol::boxed()),
MggaXTpss => Ok(mgga_x_tpss::MggaXTpss::boxed()),
MggaCTpss => Ok(mgga_c_tpss::MggaCTpss::boxed()),
MggaXR2scan => Ok(mgga_x_r2scan::MggaXR2scan::boxed()),
MggaCR2scan => Ok(mgga_c_r2scan::MggaCR2scan::boxed()),
MggaXM06L => Ok(mgga_x_m06_l::MggaXM06L::boxed()),
MggaCM06L => Ok(mgga_c_m06_l::MggaCM06L::boxed()),
HybGgaXcPbeh => hybrids::pbeh(),
HybGgaXcB3lyp5 => hybrids::b3lyp5(),
HybGgaXcB3lyp => hybrids::b3lyp(),
HybMggaXM062x => Ok(hyb_mgga_x_m06_2x::HybMggaXM062x::boxed()),
MggaCM062x => Ok(mgga_c_m06_2x::MggaCM062x::boxed()),
HybMggaXcPw6b95 => hyb_mgga_xc_pw6b95::pw6b95(),
MggaXcB97mV => Ok(mgga_xc_b97mv::MggaXcB97mV::boxed()),
HybGgaXcWb97xV => Ok(hyb_gga_xc_wb97x_v::HybGgaXcWb97xV::boxed()),
HybMggaXcWb97mV => Ok(hyb_mgga_xc_wb97m_v::HybMggaXcWb97mV::boxed()),
GgaCP86 => Ok(gga_c_p86::GgaCP86::boxed()),
HybGgaXcB2plyp => hybrids::b2plyp(),
HybGgaXcRevdsdPbep86D4 => hybrids::revdsd_pbep86_d4(),
HybMggaXcPwpb95 => hyb_mgga_xc_pwpb95::pwpb95(),
HybMggaXcWb97m2 => Ok(hyb_mgga_xc_wb97m_2::HybMggaXcWb97m2::boxed()),
}
}