Skip to main content

gitea_sdk_rs/options/
notification.rs

1// Copyright 2026 infinitete. All rights reserved.
2// Use of this source code is governed by a MIT-style
3// license that can be found in the LICENSE file.
4
5//! Request option types for notification API endpoints.
6
7use crate::pagination::ListOptions;
8use crate::types::enums::{NotifyStatus, NotifySubjectType};
9use time::OffsetDateTime;
10
11#[derive(Debug, Clone, Default)]
12/// Options for List Notification Option.
13pub struct ListNotificationOptions {
14    pub list_options: ListOptions,
15    pub since: Option<OffsetDateTime>,
16    pub before: Option<OffsetDateTime>,
17    pub status: Vec<NotifyStatus>,
18    pub subject_types: Vec<NotifySubjectType>,
19}
20
21impl crate::pagination::QueryEncode for ListNotificationOptions {
22    fn query_encode(&self) -> String {
23        let mut out = self.list_options.query_encode();
24        if let Some(since) = self.since
25            && let Ok(formatted) = since.format(&time::format_description::well_known::Rfc3339)
26        {
27            out.push_str(&format!("&since={formatted}"));
28        }
29        if let Some(before) = self.before
30            && let Ok(formatted) = before.format(&time::format_description::well_known::Rfc3339)
31        {
32            out.push_str(&format!("&before={formatted}"));
33        }
34        for s in &self.status {
35            out.push_str(&format!("&status-types={}", s.as_ref()));
36        }
37        for s in &self.subject_types {
38            out.push_str(&format!("&subject-type={}", s.as_ref()));
39        }
40        out
41    }
42}
43
44#[derive(Debug, Clone, Default)]
45/// Options for Mark Notification Option.
46pub struct MarkNotificationOptions {
47    pub last_read_at: Option<OffsetDateTime>,
48    pub status: Vec<NotifyStatus>,
49    pub to_status: Option<NotifyStatus>,
50}
51
52impl crate::pagination::QueryEncode for MarkNotificationOptions {
53    fn query_encode(&self) -> String {
54        let mut out = String::new();
55        if let Some(last_read) = self.last_read_at
56            && let Ok(formatted) = last_read.format(&time::format_description::well_known::Rfc3339)
57        {
58            out.push_str(&format!("last_read_at={formatted}"));
59        }
60        for s in &self.status {
61            if !out.is_empty() {
62                out.push('&');
63            }
64            out.push_str(&format!("status-types={}", s.as_ref()));
65        }
66        if let Some(to_status) = self.to_status {
67            if !out.is_empty() {
68                out.push('&');
69            }
70            out.push_str(&format!("to-status={}", to_status.as_ref()));
71        }
72        out
73    }
74}