Skip to content

Commit 1520787

Browse files
committed
feat(activity): add additional fields
1 parent 809e847 commit 1520787

File tree

2 files changed

+80
-30
lines changed

2 files changed

+80
-30
lines changed

src/presence/activity.rs

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use std::{borrow::Cow, ops::Deref};
1+
use std::{
2+
borrow::{Borrow, Cow},
3+
ops::Deref,
4+
};
25

36
use crate::{
47
mappings::Filetype,
@@ -20,6 +23,9 @@ pub struct CustomAssetContext {
2023
pub struct ActivityContext {
2124
pub filename: String,
2225
pub filetype: String,
26+
pub is_read_only: bool,
27+
pub cursor_position: Option<(i32, i32)>,
28+
pub problem_count: i32,
2329
pub custom_asset: Option<CustomAssetContext>,
2430
pub resolved_type: Option<Filetype>,
2531
}
@@ -36,10 +42,19 @@ impl CustomAssetContext {
3642
}
3743

3844
impl ActivityContext {
39-
pub fn new(filename: String, filetype: String) -> Self {
45+
pub fn new(
46+
filename: String,
47+
filetype: String,
48+
is_read_only: bool,
49+
cursor_position: Option<(i32, i32)>,
50+
problem_count: i32,
51+
) -> Self {
4052
let mut ctx = Self {
4153
filename,
4254
filetype,
55+
is_read_only,
56+
cursor_position,
57+
problem_count,
4358
resolved_type: None,
4459
custom_asset: None,
4560
};
@@ -143,11 +158,11 @@ impl ActivityContext {
143158
}
144159
}
145160

146-
fn build_idle_activity(&self, config: &Config) -> Option<Activity> {
161+
fn build_idle_activity(&self, config: &Config) -> Activity {
147162
let state = self.build_workspace_state(config, -1);
148163
let large_image = get_asset("editor", "idle");
149164

150-
Some(Activity {
165+
Activity {
151166
details: Some(config.idle_text.clone()),
152167
state,
153168
large_image: Some(large_image),
@@ -156,27 +171,40 @@ impl ActivityContext {
156171
small_text: None,
157172
timestamp: config.timestamp,
158173
buttons: (!config.buttons.is_empty()).then(|| config.buttons.clone()),
159-
})
174+
}
160175
}
161176

162-
fn build_details(
163-
&self,
164-
config: &Config,
165-
is_read_only: bool,
166-
cursor_position: Option<&str>,
167-
) -> String {
177+
fn build_details(&self, config: &Config) -> String {
168178
let filename = self.get_effective_name();
169179
let filename = filename.deref();
170180

171-
let mut details = if is_read_only {
172-
config.viewing_text.replace("{}", filename)
173-
} else {
174-
config.editing_text.replace("{}", filename)
175-
};
181+
let details = match self.resolved_type.as_ref().unwrap() {
182+
Filetype::Language(_, _) => {
183+
let mut details = if self.is_read_only {
184+
config.viewing_text.replace("{}", filename)
185+
} else {
186+
config.editing_text.replace("{}", filename)
187+
};
176188

177-
if let Some(pos) = cursor_position {
178-
details = format!("{}:{}", details, pos);
179-
}
189+
if let Some((line, char)) = self.cursor_position {
190+
details = details + ":" + &line.to_string() + ":" + &char.to_string();
191+
}
192+
193+
details
194+
}
195+
Filetype::FileBrowser(_, _) => config
196+
.file_browser_text
197+
.replace("{}", self.get_effective_name().borrow()),
198+
Filetype::PluginManager(_, _) => config
199+
.plugin_manager_text
200+
.replace("{}", self.get_effective_name().borrow()),
201+
Filetype::Lsp(_, _) => config
202+
.lsp_manager_text
203+
.replace("{}", self.get_effective_name().borrow()),
204+
Filetype::Vcs(_, _) => config
205+
.vcs_text
206+
.replace("{}", self.get_effective_name().borrow()),
207+
};
180208

181209
details
182210
}
@@ -244,19 +272,13 @@ impl ActivityContext {
244272
}
245273
}
246274

247-
pub fn build(
248-
&self,
249-
config: &Config,
250-
is_read_only: bool,
251-
cursor_position: Option<&str>,
252-
problem_count: i32,
253-
) -> Option<Activity> {
275+
pub fn build(&self, config: &Config) -> Activity {
254276
if self.filetype == "Cord.idle" {
255277
return self.build_idle_activity(config);
256278
}
257279

258-
let details = self.build_details(config, is_read_only, cursor_position);
259-
let state = self.build_workspace_state(config, problem_count);
280+
let details = self.build_details(config);
281+
let state = self.build_workspace_state(config, self.problem_count);
260282

261283
let large_image = Some(self.get_effective_icon());
262284
let large_text = Some(self.get_effective_tooltip()).map(|s| s.to_owned());
@@ -265,7 +287,7 @@ impl ActivityContext {
265287
self.swap_images(config, large_image, large_text, config.swap_icons);
266288
let (details, state) = self.swap_fields(details, state, config.swap_fields);
267289

268-
Some(Activity {
290+
Activity {
269291
details: Some(details),
270292
state: state.map(|s| s.to_owned()),
271293
large_image: large_image.map(|s| s.to_owned()),
@@ -274,6 +296,6 @@ impl ActivityContext {
274296
small_text,
275297
timestamp: config.timestamp,
276298
buttons: (!config.buttons.is_empty()).then(|| config.buttons.clone()),
277-
})
299+
}
278300
}
279301
}

src/presence/parse.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,31 @@ impl Deserialize for ActivityContext {
2121
.ok_or("Missing or invalid 'filetype' field")?
2222
.to_string();
2323

24+
let is_read_only = input
25+
.get("is_read_only")
26+
.and_then(|v| v.as_bool())
27+
.ok_or("Missing or invalid 'is_read_only' field")?;
28+
29+
let mut cursor_position = None;
30+
if let Some(cursor) = input.get("cursor_position") {
31+
let array = cursor.as_array().ok_or("Invalid 'cursor_position' field")?;
32+
let line = array
33+
.first()
34+
.and_then(|v| v.as_number())
35+
.ok_or("Invalid 'cursor_position' field")? as i32;
36+
let char = array
37+
.get(1)
38+
.and_then(|v| v.as_number())
39+
.ok_or("Invalid 'cursor_position' field")? as i32;
40+
41+
cursor_position = Some((line, char));
42+
}
43+
44+
let problem_count = input
45+
.get("problem_count")
46+
.and_then(|v| v.as_number())
47+
.ok_or("Missing or invalid 'problem_count' field")? as i32;
48+
2449
let custom_asset = input
2550
.get("custom_asset")
2651
.and_then(|v| v.as_map().map(CustomAssetContext::deserialize))
@@ -29,6 +54,9 @@ impl Deserialize for ActivityContext {
2954
Ok(ActivityContext {
3055
filename,
3156
filetype,
57+
is_read_only,
58+
cursor_position,
59+
problem_count,
3260
custom_asset,
3361
resolved_type: None,
3462
})

0 commit comments

Comments
 (0)