Files
Gotcha/crates/app/src/core/widgets.rs
2026-08-03 22:06:32 +02:00

56 lines
1.5 KiB
Rust

use crate::*;
const MAX_WIDGET_ROWS: u32 = 10;
#[uniffi::export(async_runtime = "tokio")]
impl GotchaCore {
pub async fn widget_activity(
&self,
server_id: String,
limit: u32,
) -> Result<WidgetActivityPage, GotchaError> {
let server = self.server_by_id(&server_id)?;
let mut rows = activity_rows(&load_activities(&server, 1).await?.items);
rows.truncate(widget_limit(limit)?);
Ok(WidgetActivityPage {
server_name: server.name,
rows,
})
}
pub async fn widget_pulls(
&self,
server_id: String,
limit: u32,
) -> Result<WidgetPullPage, GotchaError> {
let server = self.server_by_id(&server_id)?;
let pulls = load_pulls(&server, "open", "", "", 1).await?;
let mut rows = pull_rows(&pulls.items);
rows.truncate(widget_limit(limit)?);
Ok(WidgetPullPage {
server_name: server.name,
rows,
})
}
}
fn widget_limit(limit: u32) -> Result<usize, GotchaError> {
(1..=MAX_WIDGET_ROWS)
.contains(&limit)
.then_some(limit as usize)
.ok_or_else(|| "Widget row count must be between 1 and 10.".into())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn validates_widget_row_limits() {
assert_eq!(widget_limit(1).unwrap(), 1);
assert_eq!(widget_limit(10).unwrap(), 10);
assert!(widget_limit(0).is_err());
assert!(widget_limit(11).is_err());
}
}