pyoe2_craftpath/
lib.rs

1pub mod api;
2pub mod calc;
3pub mod external_api;
4pub mod utils;
5
6pub const GITHUB_REPOSITORY: &str = "WladHD/pyoe2-craftpath";
7
8#[cfg(feature = "python")]
9pub mod py {
10    use pyo3::exceptions::PyRuntimeError;
11    use pyo3::prelude::*;
12    use pyo3_stub_gen::define_stub_info_gatherer;
13    use pyo3_stub_gen::derive::gen_stub_pyfunction;
14
15    use crate::GITHUB_REPOSITORY;
16    use crate::api::calculator::{
17        Calculator, DynMatrixBuilder, DynStatisticAnalyzerCurrencyGroups,
18        DynStatisticAnalyzerPaths, GroupRoute, ItemMatrixNode, ItemRoute, ItemRouteNode,
19        PropagationTarget, StatisticResult,
20    };
21    use crate::api::currency::{CraftCurrencyEnum, CraftCurrencyList};
22    use crate::api::item::{Item, ItemSnapshot, ItemSnapshotHelper, ItemTechnicalMeta};
23    use crate::api::provider::item_info::ItemInfoProvider;
24    use crate::api::provider::market_prices::{
25        ItemName, MarketPriceProvider, PriceInDivines, PriceKind,
26    };
27    use crate::api::types::{
28        AffixClassEnum, AffixDefinition, AffixId, AffixLocationEnum, AffixSpecifier,
29        AffixTierConstraints, AffixTierLevel, AffixTierLevelBoundsEnum, AffixTierLevelMeta,
30        BaseGroupDefinition, BaseGroupId, BaseItemId, EssenceDefinition, EssenceId,
31        EssenceTierLevelMeta, ItemId, ItemRarityEnum, THashMap, Weight,
32    };
33    use crate::calc::matrix::presets::matrix_builder_presets::MatrixBuilderPreset;
34    use crate::calc::statistics::helpers::{RouteChance, RouteCustomWeight};
35    use crate::calc::statistics::presets::statistic_analyzer_currency_group_presets::StatisticAnalyzerCurrencyGroupPreset;
36    use crate::calc::statistics::presets::statistic_analyzer_path_presets::StatisticAnalyzerPathPreset;
37    use crate::external_api::coe::craftofexile_data_provider_adapter::CraftOfExileItemInfoProvider;
38    use crate::external_api::coe_emulator::coe_emulator_item_snapshot_provider::CraftOfExileEmulatorItemImport;
39    use crate::external_api::pn::poe_ninja_data_provider_adapter::PoeNinjaMarketPriceProvider;
40    use crate::utils::fraction_utils::Fraction;
41    use crate::utils::logger_utils::init_tracing;
42    use crate::utils::version_checker_utils::check_new_version;
43
44    #[gen_stub_pyfunction]
45    #[pyfunction]
46    /**
47     * Order-preservation of `cache_url_map` is not guaranteed.
48     * If order is required, split requests into single function calls.
49     * E. g. Group 1. item info, Group 2. economy.
50     */
51    fn retrieve_contents_from_urls_with_cache_unstable_order(
52        cache_url_map: THashMap<String, String>,
53        max_cache_duration_in_sec: u64,
54    ) -> PyResult<Vec<String>> {
55        crate::external_api::fetch_json_from_urls::retrieve_contents_from_urls_with_cache_unstable_order(
56            cache_url_map,
57            max_cache_duration_in_sec,
58        )
59        .map_err(|err| PyRuntimeError::new_err(err.to_string()))
60    }
61
62    #[gen_stub_pyfunction]
63    #[pyfunction]
64    fn check_for_updates_and_print() -> PyResult<bool> {
65        check_new_version(GITHUB_REPOSITORY).map_err(|err| PyRuntimeError::new_err(err.to_string()))
66    }
67
68    #[pymodule]
69    fn pyoe2_craftpath(m: &Bound<'_, PyModule>) -> PyResult<()> {
70        init_tracing();
71
72        ctrlc::set_handler(|| std::process::exit(2)).unwrap();
73
74        // Affix classes
75        m.add_class::<AffixId>()?;
76        m.add_class::<AffixDefinition>()?;
77        m.add_class::<AffixClassEnum>()?;
78        m.add_class::<AffixLocationEnum>()?;
79        m.add_class::<AffixSpecifier>()?;
80        m.add_class::<AffixTierConstraints>()?;
81        m.add_class::<AffixTierLevel>()?;
82        m.add_class::<AffixTierLevelMeta>()?;
83
84        // Item classes
85        m.add_class::<BaseItemId>()?;
86        m.add_class::<BaseGroupId>()?;
87        m.add_class::<BaseGroupDefinition>()?;
88        m.add_class::<ItemName>()?;
89        m.add_class::<ItemId>()?;
90        m.add_class::<Item>()?;
91        m.add_class::<ItemSnapshot>()?;
92        m.add_class::<ItemSnapshotHelper>()?;
93        m.add_class::<ItemTechnicalMeta>()?;
94        m.add_class::<ItemMatrixNode>()?;
95        m.add_class::<ItemRoute>()?;
96        m.add_class::<ItemRouteNode>()?;
97
98        // Calculator / matrix
99        m.add_class::<Calculator>()?;
100        m.add_class::<DynMatrixBuilder>()?;
101        m.add_class::<MatrixBuilderPreset>()?;
102
103        // Statistics analyzers
104        m.add_class::<DynStatisticAnalyzerPaths>()?;
105        m.add_class::<DynStatisticAnalyzerCurrencyGroups>()?;
106        m.add_class::<StatisticAnalyzerPathPreset>()?;
107        m.add_class::<StatisticAnalyzerCurrencyGroupPreset>()?;
108
109        // Currency / prices
110        m.add_class::<CraftCurrencyEnum>()?;
111        m.add_class::<CraftCurrencyList>()?;
112        m.add_class::<PriceInDivines>()?;
113        m.add_class::<PriceKind>()?;
114
115        // Providers
116        m.add_class::<ItemInfoProvider>()?;
117        m.add_class::<MarketPriceProvider>()?;
118        m.add_class::<PoeNinjaMarketPriceProvider>()?;
119        m.add_class::<CraftOfExileItemInfoProvider>()?;
120        m.add_class::<CraftOfExileEmulatorItemImport>()?;
121
122        // Essence classes
123        m.add_class::<EssenceId>()?;
124        m.add_class::<EssenceDefinition>()?;
125        m.add_class::<EssenceTierLevelMeta>()?;
126
127        // Misc / route
128        m.add_class::<GroupRoute>()?;
129        m.add_class::<RouteChance>()?;
130        m.add_class::<RouteCustomWeight>()?;
131        m.add_class::<PropagationTarget>()?;
132        m.add_class::<StatisticResult>()?;
133        m.add_class::<Weight>()?;
134        m.add_class::<Fraction>()?;
135
136        // Enums
137        m.add_class::<AffixTierLevelBoundsEnum>()?;
138        m.add_class::<ItemRarityEnum>()?;
139
140        // general utility
141        m.add_function(wrap_pyfunction!(
142            retrieve_contents_from_urls_with_cache_unstable_order,
143            m
144        )?)?;
145        m.add_function(wrap_pyfunction!(check_for_updates_and_print, m)?)?;
146
147        Ok(())
148    }
149
150    define_stub_info_gatherer!(stub_info);
151}