Skip to main content

dxm_artifacts/
cfx.rs

1//! Contains code for accessing the FXServer version changelog.
2
3pub 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/// Represents the FXServer version changelog.
15///
16/// Does not support `ArtifactsChannel::LatestJg`.
17/// Use `dxm_artifacts::jg` instead.
18#[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    /// Returns the FXServer version for the given update channel.
33    ///
34    /// Panics if given `LatestJg` - use `dxm_artifacts::jg` instead.
35    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    /// Returns the txAdmin version for the given update channel.
48    ///
49    /// Panics if given `LatestJg` - use `dxm_artifacts::jg` instead.
50    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    /// Returns a string containing information for the given update channel.
63    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
72/// Fetches and returns the FXServer version changelog.
73pub 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
82/// Returns the changelog URL for the given platform.
83fn 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}