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 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 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 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 m.add_class::<Calculator>()?;
100 m.add_class::<DynMatrixBuilder>()?;
101 m.add_class::<MatrixBuilderPreset>()?;
102
103 m.add_class::<DynStatisticAnalyzerPaths>()?;
105 m.add_class::<DynStatisticAnalyzerCurrencyGroups>()?;
106 m.add_class::<StatisticAnalyzerPathPreset>()?;
107 m.add_class::<StatisticAnalyzerCurrencyGroupPreset>()?;
108
109 m.add_class::<CraftCurrencyEnum>()?;
111 m.add_class::<CraftCurrencyList>()?;
112 m.add_class::<PriceInDivines>()?;
113 m.add_class::<PriceKind>()?;
114
115 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 m.add_class::<EssenceId>()?;
124 m.add_class::<EssenceDefinition>()?;
125 m.add_class::<EssenceTierLevelMeta>()?;
126
127 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 m.add_class::<AffixTierLevelBoundsEnum>()?;
138 m.add_class::<ItemRarityEnum>()?;
139
140 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}