1pub use channel::ArtifactsChannel;
4pub use platform::ArtifactsPlatform;
5use reqwest::blocking::Client;
6use serde::Deserialize;
7
8mod channel;
9mod platform;
10
11const CFX_SERVER_VERSIONS_API_URL: &str =
12 "https://changelogs-live.fivem.net/api/changelog/versions/{platform}/server";
13
14#[derive(Deserialize)]
19pub struct ServerVersions {
20 critical: String,
21 recommended: String,
22 optional: String,
23 latest: String,
24
25 critical_txadmin: String,
26 recommended_txadmin: String,
27 optional_txadmin: String,
28 latest_txadmin: String,
29}
30
31impl ServerVersions {
32 pub fn version(&self, channel: &ArtifactsChannel) -> &str {
36 match channel {
37 ArtifactsChannel::Critical => &self.critical,
38 ArtifactsChannel::Recommended => &self.recommended,
39 ArtifactsChannel::Optional => &self.optional,
40 ArtifactsChannel::Latest => &self.latest,
41 ArtifactsChannel::LatestJg => {
42 panic!("received unexpected LatestJg in cfx server versions")
43 }
44 }
45 }
46
47 pub fn txadmin(&self, channel: &ArtifactsChannel) -> &str {
51 match channel {
52 ArtifactsChannel::Critical => &self.critical_txadmin,
53 ArtifactsChannel::Recommended => &self.recommended_txadmin,
54 ArtifactsChannel::Optional => &self.optional_txadmin,
55 ArtifactsChannel::Latest => &self.latest_txadmin,
56 ArtifactsChannel::LatestJg => {
57 panic!("received unexpected LatestJg in cfx server versions")
58 }
59 }
60 }
61
62 pub fn alias_display(&self, alias: &ArtifactsChannel) -> String {
64 format!(
65 "{}\twith txAdmin v{}",
66 self.version(alias),
67 self.txadmin(alias)
68 )
69 }
70}
71
72pub fn versions(client: &Client, platform: &ArtifactsPlatform) -> reqwest::Result<ServerVersions> {
74 log::trace!("getting artifacts versions");
75
76 let url = changelogs_url(platform);
77 let resp = client.get(url).send()?.error_for_status()?;
78
79 resp.json::<ServerVersions>()
80}
81
82fn changelogs_url(platform: &ArtifactsPlatform) -> String {
84 CFX_SERVER_VERSIONS_API_URL.replace("{platform}", platform.changelogs_name())
85}
86
87#[cfg(test)]
88mod tests {
89 use super::*;
90
91 #[test]
92 fn returns_changelogs_url() {
93 assert_eq!(
94 changelogs_url(&ArtifactsPlatform::Windows),
95 "https://changelogs-live.fivem.net/api/changelog/versions/win32/server"
96 );
97 }
98}