eve_esi_api/
lib.rs

1mod api;
2pub mod domain;
3mod errors;
4
5use api::authent::builder::Oauth2AuthentBuilder;
6pub use api::authent::oauth2::{Authent, Verify};
7pub(crate) type Result<T> = std::result::Result<T, EveEsiError>;
8
9pub use api::client::ApiClient;
10
11pub use api::characters;
12pub use api::market;
13pub use api::search;
14pub use api::universe;
15pub use api::wallet;
16pub use domain::typedef::*;
17pub use errors::EveEsiError;
18
19/// The main struct you will use.
20///
21/// Eve_api struct is backed internally by ARCs, you can use it in async, and clone it with little overhead.
22///
23/// ```rust,no_run
24/// async {
25///     let client_id = std::env::var("CLIENT_ID").expect("CLIENT_ID needed as environment variable");
26///     let client_secret = std::env::var("CLIENT_SECRET").expect("CLIENT_SECRET missing");
27///     let scopes = vec!["publicData"];
28///     let params = EveApiParam {
29///         client_id,
30///         client_secret,
31///         scopes,
32///         token_path: None,
33///     };
34///     let eve_api = eve_esi_api::EveApi::new(params).await?;
35///     println!("logged as {}", eve_api.character().character_name);
36///     let regions = eve_esi_api::universe::all_regions(eve_api.client()).await?;
37/// }
38/// ```
39///
40/// Api calls take a reference to a client.
41/// They are grouped by eve-esi groups structure :
42/// universe, wallet, market are currently implemented
43///
44#[derive(Clone)]
45pub struct EveApi {
46    client: ApiClient,
47    character: Verify,
48}
49
50pub struct EveApiParam {
51    client_id: String,
52    client_secret: String,
53    scopes: Vec<String>,
54    token_path: Option<String>,
55    esi_url: String,
56    auth_url: String,
57    user_agent: String,
58}
59
60impl EveApi {
61    pub async fn new(params: EveApiParam) -> Result<Self> {
62        let mut auth_builder = Oauth2AuthentBuilder::new(params.client_id, params.client_secret)
63            .with_scopes(params.scopes.iter().map(|s| s.as_str()).collect());
64        if let Some(token) = params.token_path {
65            auth_builder = auth_builder.with_token_path(&token);
66        }
67
68        let mut auth = auth_builder.build();
69
70        auth.authenticate().await?;
71        let character = auth.verify().await?;
72        let client = ApiClient::new(
73            auth.get_authent()?,
74            params.esi_url,
75            params.auth_url,
76            params.user_agent,
77        )?;
78
79        Ok(EveApi { client, character })
80    }
81
82    /// client to give in api calls
83    pub fn client(&self) -> &ApiClient {
84        &self.client
85    }
86
87    /// logged character
88    pub fn character(&self) -> &Verify {
89        &self.character
90    }
91}
92
93impl EveApiParam {
94    pub fn new(client_id: String, client_secret: String) -> Self {
95        Self {
96            client_id,
97            client_secret,
98            scopes: vec![],
99            token_path: None,
100            auth_url: "https://login.eveonline.com".to_string(),
101            esi_url: "https://esi.evetech.net/latest".to_string(),
102            user_agent: "eve_esi_api_0.0.3".to_string(),
103        }
104    }
105
106    pub fn with_token_path(self, token_path: String) -> Self {
107        Self {
108            client_id: self.client_id,
109            client_secret: self.client_secret,
110            scopes: self.scopes,
111            token_path: Some(token_path),
112            auth_url: self.auth_url,
113            esi_url: self.esi_url,
114            user_agent: self.user_agent,
115        }
116    }
117
118    pub fn with_scopes<S>(self, scopes: Vec<S>) -> Self
119    where
120        S: Into<String>,
121    {
122        Self {
123            client_id: self.client_id,
124            client_secret: self.client_secret,
125            scopes: scopes
126                .into_iter()
127                .map(|s| <S as Into<String>>::into(s))
128                .collect(),
129            token_path: self.token_path,
130            auth_url: self.auth_url,
131            esi_url: self.esi_url,
132            user_agent: self.user_agent,
133        }
134    }
135
136    pub fn add_scope<S>(self, scope: S) -> Self
137    where
138        S: Into<String>,
139    {
140        let mut scopes = self.scopes;
141        scopes.push(scope.into());
142        Self {
143            client_id: self.client_id,
144            client_secret: self.client_secret,
145            scopes,
146            token_path: self.token_path,
147            auth_url: self.auth_url,
148            esi_url: self.esi_url,
149            user_agent: self.user_agent,
150        }
151    }
152
153    pub fn with_esi_url(self, esi_url: String) -> Self {
154        Self {
155            client_id: self.client_id,
156            client_secret: self.client_secret,
157            scopes: self.scopes,
158            token_path: self.token_path,
159            auth_url: self.auth_url,
160            esi_url,
161            user_agent: self.user_agent,
162        }
163    }
164
165    pub fn with_auth_url(self, auth_url: String) -> Self {
166        Self {
167            client_id: self.client_id,
168            client_secret: self.client_secret,
169            scopes: self.scopes,
170            token_path: self.token_path,
171            auth_url,
172            esi_url: self.esi_url,
173            user_agent: self.user_agent,
174        }
175    }
176
177    pub fn with_user_agent(self, user_agent: String) -> Self {
178        Self {
179            client_id: self.client_id,
180            client_secret: self.client_secret,
181            scopes: self.scopes,
182            token_path: self.token_path,
183            auth_url: self.auth_url,
184            esi_url: self.esi_url,
185            user_agent,
186        }
187    }
188}