Compare commits

...

7 commits
main ... tasyn

14 changed files with 70 additions and 10 deletions

View file

@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
use url::Url;
/// Represents a generic attachment.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Attachment {
/// The browser download URL of the attachment.
pub browser_download_url: Url,

View file

@ -21,6 +21,7 @@ pub struct CreateIssueOption {
/// The milestone ID for the issue.
pub milestone: Option<usize>,
/// The reference for the issue.
#[serde(rename = "ref")]
pub ref_field: String,
/// The title of the issue (required).
pub title: String,

View file

@ -34,6 +34,7 @@ impl EditIssueOption {
assignee: issue.assignee.as_ref().map(|user| user.login_name.clone()),
assignees: issue
.assignees
.unwrap_or_default()
.iter()
.map(|user| user.login_name.clone())
.collect::<Vec<_>>(),

View file

@ -50,14 +50,14 @@ use crate::types::misc::boolean_enums::is::locked::IsLocked;
use crate::types::misc::boolean_enums::state_type::StateType;
/// Represents an issue in a repository.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Issue {
/// List of attachments.
pub assets: Vec<Attachment>,
/// The user assigned to the issue.
pub assignee: Option<User>,
/// List of assignees.
pub assignees: Vec<User>,
pub assignees: Option<Vec<User>>,
/// The body of the issue.
pub body: String,
/// The date and time when the issue was closed (if closed).
@ -87,6 +87,7 @@ pub struct Issue {
/// Pull request information for the issue.
pub pull_request: Option<PullRequestMeta>,
/// The reference for the issue.
#[serde(rename = "ref")]
pub ref_field: String,
/// Metadata for the repository.
pub repository: RepositoryMeta,

View file

@ -7,7 +7,7 @@ use crate::types::misc::boolean_enums::is::exclusive::Exclusive;
use crate::types::misc::color::Color;
/// Label represents a label attached to an issue or a PR.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Label {
/// The color of the label (in hexadecimal format).
pub color: Color,

View file

@ -24,7 +24,7 @@ use serde::{Deserialize, Serialize};
use crate::types::misc::boolean_enums::state_type::StateType;
/// Milestone represents a collection of issues on one repository.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Milestone {
/// The timestamp when the milestone was closed.
pub closed_at: Option<DateTime<Utc>>,

View file

@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
use crate::types::misc::boolean_enums::is::merged::IsMerged;
/// PullRequestMeta represents PR information for an issue if it is a PR.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PullRequestMeta {
/// Indicates whether the PR is merged or not.
pub merged: IsMerged,

View file

@ -3,7 +3,7 @@ use std::fmt::Display;
use serde::{Deserialize, Serialize};
/// Represents basic repository information.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RepositoryMeta {
/// The full name of the repository.
pub full_name: String,

View file

@ -113,4 +113,36 @@ mod tests {
};
assert_eq!(user, expected);
}
#[test]
fn deserialize_works_with_blank_language() {
let data = include_str!("../../../test_data/example_user_blank_language.json");
let user: User = serde_json::from_str(data).unwrap();
let expected = User {
active: IsActive::Yes,
avatar_url: OptionalUrl::Some(
Url::from_str("https://codeberg.org/avatars/foo-bar").unwrap(),
),
created: DateTime::from_str("2022-11-04T14:41:29Z").unwrap(),
description: String::from(""),
email: Email::from_str("example@mail.com").unwrap(),
followers_count: 2,
following_count: 1,
full_name: String::from(""),
id: 12345,
is_admin: IsAdmin::No,
language: Locale::None,
last_login: DateTime::from_str("2023-07-26T19:38:27Z").unwrap(),
location: String::from(""),
login: String::from("ExampleUser"),
login_name: String::from(""),
prohibit_login: ProhibitLogin::No,
restricted: IsRestricted::No,
starred_repos_count: 0,
username: String::from("ExampleUser"),
visibility: Visibility::Public,
website: OptionalUrl::Some(Url::from_str("https://example.com").unwrap()),
};
assert_eq!(user, expected);
}
}

View file

@ -11,5 +11,5 @@ implement_boolean_enum!(ignore_whitespace_conflicts, IgnoreWhitespaceConflicts);
implement_boolean_enum!(includes_all_repositories, IncludesAllRepositories);
implement_boolean_enum!(prohibit_login, ProhibitLogin);
implement_boolean_enum!(auto_init, AutoInit);
implement_boolean_enum!(state_type, StateType { Open, Closed });
implement_boolean_enum!(state_type, StateType { Closed, Open });
implement_boolean_enum!(unset_due_date, UnsetDueDate { Unset, Keep });

View file

@ -6,7 +6,7 @@ use palette::Srgb;
use serde::de::Visitor;
use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Color(pub(crate) Rgb<Srgb, u8>);
impl Display for Color {

View file

@ -18,6 +18,8 @@ use strum::{Display, EnumIs, EnumIter, EnumString};
)]
pub enum Locale {
// 🚧🚧 TODO 🚧🚧 : extend the list
#[serde(rename = "")]
None,
#[serde(rename = "de-DE")]
De,
#[serde(rename = "en-US")]

View file

@ -68,7 +68,7 @@
"original_author": "original_author",
"original_author_id": 123,
"pull_request": null,
"ref_field": "refs/1",
"ref": "refs/1",
"repository": {
"full_name": "exampleuser/example-repo",
"id": 123,

View file

@ -0,0 +1,23 @@
{
"active": true,
"avatar_url": "https://codeberg.org/avatars/foo-bar",
"created": "2022-11-04T14:41:29Z",
"description": "",
"email": "example@mail.com",
"followers_count": 2,
"following_count": 1,
"full_name": "",
"id": 12345,
"is_admin": false,
"language": "",
"last_login": "2023-07-26T19:38:27Z",
"location": "",
"login": "ExampleUser",
"login_name": "",
"prohibit_login": false,
"restricted": false,
"starred_repos_count": 0,
"username": "ExampleUser",
"visibility": "public",
"website": "https://example.com"
}