Skip to content

Commit eac1ec7

Browse files
committed
feat: add public-ip support
1 parent bb9f631 commit eac1ec7

16 files changed

Lines changed: 235 additions & 60 deletions

File tree

Cargo.lock

Lines changed: 42 additions & 40 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ strip-ansi-escapes = "0.2.1"
3333
starship-battery = "0.10.2"
3434
supports-unicode = "3.0.0"
3535
csscolorparser = "0.7.2"
36-
serde_json = "1.0.140"
36+
serde_json = "1.0.142"
3737
sys-locale = "0.3.2"
38-
sysinfo = "0.36.0"
38+
sysinfo = "0.36.1"
3939
bitcode = "0.6.6"
40-
minreq = "2.14.0"
40+
socket2 = "0.6.0"
4141
rayon = "1.10.0"
4242
which = "8.0.0"
4343
dirs = "6.0.0"

src/config/deserialize.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ struct InfoConfig<'a> {
2323
disks: Option<DisksInfoConfig<'a>>,
2424
#[serde(default, borrow)]
2525
networks: Option<NetworksInfoConfig<'a>>,
26+
#[serde(default, borrow)]
27+
public_ip: Option<PublicIpInfoConfig<'a>>,
2628
}
2729

2830
#[derive(Debug, Deserialize)]
@@ -47,6 +49,22 @@ struct NetworksInfoConfig<'a> {
4749
ignore_loopback: Option<bool>,
4850
}
4951

52+
#[derive(Debug, Deserialize)]
53+
struct PublicIpInfoConfig<'a> {
54+
#[serde(default, borrow)]
55+
ipv4_domain: Option<&'a str>,
56+
#[serde(default)]
57+
ipv4_port: Option<u16>,
58+
#[serde(default, borrow)]
59+
ipv4_path: Option<&'a str>,
60+
#[serde(default, borrow)]
61+
ipv6_domain: Option<&'a str>,
62+
#[serde(default)]
63+
ipv6_port: Option<u16>,
64+
#[serde(default, borrow)]
65+
ipv6_path: Option<&'a str>,
66+
}
67+
5068
#[derive(Debug, Deserialize)]
5169
#[serde(rename_all = "snake_case")]
5270
enum ColorBlockStyle<'a> {
@@ -243,6 +261,21 @@ impl<'de: 'static> serde::Deserialize<'de> for super::Config {
243261
ignore_loopback: networks.ignore_loopback.unwrap_or(true),
244262
})
245263
.unwrap_or_default(),
264+
public_ip: info
265+
.public_ip
266+
.map(|public_ip| super::PublicIpInfoConfig {
267+
ipv4_domain: public_ip
268+
.ipv4_domain
269+
.unwrap_or(super::DEFAULT_IPV4_DOMAIN),
270+
ipv4_port: public_ip.ipv4_port.unwrap_or(super::DEFAULT_IPV4_PORT),
271+
ipv4_path: public_ip.ipv4_path.unwrap_or(super::DEFAULT_IPV4_PATH),
272+
ipv6_domain: public_ip
273+
.ipv6_domain
274+
.unwrap_or(super::DEFAULT_IPV6_DOMAIN),
275+
ipv6_port: public_ip.ipv6_port.unwrap_or(super::DEFAULT_IPV6_PORT),
276+
ipv6_path: public_ip.ipv6_path.unwrap_or(super::DEFAULT_IPV6_PATH),
277+
})
278+
.unwrap_or_default(),
246279
})
247280
.unwrap_or_default(),
248281
})

src/config/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ const FALLBACK_COLOR: Option<ColorWrapper> = Some(ColorWrapper::Rgb {
1717
g: 255,
1818
b: 255,
1919
});
20+
const DEFAULT_IPV4_DOMAIN: &str = "ipinfo.io";
21+
const DEFAULT_IPV4_PORT: u16 = 80;
22+
const DEFAULT_IPV4_PATH: &str = "/ip";
23+
const DEFAULT_IPV6_DOMAIN: &str = "v6.ipinfo.io";
24+
const DEFAULT_IPV6_PORT: u16 = 80;
25+
const DEFAULT_IPV6_PATH: &str = "/ip";
2026

2127
#[derive(Debug, Decode, Encode)]
2228
pub struct Config {
@@ -32,6 +38,7 @@ pub struct Config {
3238
pub struct InfoConfig<'a> {
3339
pub disks: DisksInfoConfig<'a>,
3440
pub networks: NetworksInfoConfig<'a>,
41+
pub public_ip: PublicIpInfoConfig<'a>,
3542
}
3643

3744
#[derive(Debug, Decode, Encode)]
@@ -49,6 +56,16 @@ pub struct NetworksInfoConfig<'a> {
4956
pub ignore_loopback: bool,
5057
}
5158

59+
#[derive(Debug, Decode, Encode)]
60+
pub struct PublicIpInfoConfig<'a> {
61+
pub ipv4_domain: &'a str,
62+
pub ipv4_port: u16,
63+
pub ipv4_path: &'a str,
64+
pub ipv6_domain: &'a str,
65+
pub ipv6_port: u16,
66+
pub ipv6_path: &'a str,
67+
}
68+
5269
impl<'a> Default for DisksInfoConfig<'a> {
5370
fn default() -> Self {
5471
Self {
@@ -72,6 +89,19 @@ impl<'a> Default for NetworksInfoConfig<'a> {
7289
}
7390
}
7491

92+
impl<'a> Default for PublicIpInfoConfig<'a> {
93+
fn default() -> Self {
94+
Self {
95+
ipv4_domain: DEFAULT_IPV4_DOMAIN,
96+
ipv4_port: DEFAULT_IPV4_PORT,
97+
ipv4_path: DEFAULT_IPV4_PATH,
98+
ipv6_domain: DEFAULT_IPV6_DOMAIN,
99+
ipv6_port: DEFAULT_IPV6_PORT,
100+
ipv6_path: DEFAULT_IPV6_PATH,
101+
}
102+
}
103+
}
104+
75105
#[derive(Debug, Decode, Encode)]
76106
pub struct ColorOption {
77107
pub header: Option<ColorWrapper>,

src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use afetch::system::memory::get_memory;
1212
use afetch::system::motherboard::get_motherboard;
1313
use afetch::system::networks::get_networks;
1414
use afetch::system::product::get_product;
15+
use afetch::system::public_ip::get_public_ip;
1516
use afetch::system::uptime::get_uptime;
1617
use afetch::system::{InfoGroup, InfoKind, InfoResult};
1718
use afetch::translations::get_language;
@@ -47,6 +48,7 @@ fn main() -> Result<(), FetchInfoError> {
4748
InfoKind::Motherboard => get_motherboard(language_func, fields, &config),
4849
InfoKind::Networks => get_networks(language_func, fields, &config),
4950
InfoKind::Product => get_product(language_func, fields, &config),
51+
InfoKind::PublicIp => get_public_ip(language_func, fields, &config),
5052
InfoKind::Uptime => get_uptime(language_func, fields, &config),
5153
},
5254
)

src/system/battery.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ use crate::config::Config;
22
use crate::error::FetchInfoError;
33
use crate::filtered_values;
44
use crate::system::{InfoField, InfoGroup, InfoResult, InfoValue};
5-
use crate::util::ToOptionString;
6-
use crate::util::format_time;
5+
use crate::util::{ToOptionString, format_time};
76
use starship_battery::units::time::second;
87

98
pub fn get_battery(

src/system/disk.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ use crate::error::FetchInfoError;
33
use crate::filtered_values;
44
use crate::system::disks::ignore_disk;
55
use crate::system::{InfoField, InfoGroup, InfoResult, InfoValue};
6-
use crate::util::ToOptionString;
7-
use crate::util::convert_to_readable_unity;
6+
use crate::util::{ToOptionString, convert_to_readable_unity};
87
use sysinfo::Disks;
98

109
pub fn get_disk(

0 commit comments

Comments
 (0)