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#[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 pub fn client(&self) -> &ApiClient {
84 &self.client
85 }
86
87 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}