Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
484 changes: 404 additions & 80 deletions libft-api-derive/src/lib.rs

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions libft-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ path="src/lib.rs"
name = "piscine_users"
path = "bin/piscine_users.rs"

[[bin]]
name = "locations"
path = "bin/locations.rs"

[[example]]
name = "scroll"

Expand Down
50 changes: 50 additions & 0 deletions libft-api/bin/locations.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
use std::{io::Write, sync::Arc};

use futures::FutureExt;
use libft_api::{info::ft_campus_id::GYEONGSAN, prelude::*};
use tokio::task::JoinSet;

#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
let client = Arc::new(FtClient::new(FtClientReqwestConnector::new()));

let req: ReqFn<_> = |session, page| {
async move {
session
.users(
FtApiUsersRequest::new()
.with_page(page)
.with_per_page(100)
.with_filter(vec![FtFilterOption::new(
FtFilterField::PrimaryCampusId,
vec![GYEONGSAN.to_string()],
)])
.with_range(vec![FtRangeOption::new(
FtRangeField::CreatedAt,
vec!["2025-09-01".to_owned(), "2025-10-20".to_owned()],
)]),
)
.await
}
.boxed()
};

let mut handles = JoinSet::new();
for i in 1..=8 {
let client = Arc::clone(&client);
handles.spawn(async move { scroller(&client, 8, i, req).await });
}

let mut result = Vec::new();
while let Some(res) = handles.join_next().await {
match res {
Ok(v) => result.extend(v),
Err(e) => tracing::error!("task failed: {e}"),
}
}

let mut file = std::fs::File::create("pisciner.json").unwrap();
file.write_all(serde_json::to_string_pretty(&result).unwrap().as_bytes())
.unwrap();
}
28 changes: 19 additions & 9 deletions libft-api/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,24 @@ pub mod user;

pub mod prelude;

/// Convenience abstraction for wrapper types that contain a `Vec<T>` under a single field.
///
/// This trait simplifies access to vector fields in API response types.
///
pub trait HasVec<T> {
/// Get a reference to the contained vector.
fn get_vec(&self) -> &Vec<T>;
// 모드 마커
pub trait CollectMode {}
pub enum Values {}
impl CollectMode for Values {}
pub enum Entries {}
impl CollectMode for Entries {}

/// Take ownership of the contained vector.
fn take_vec(self) -> Vec<T>;
pub trait HasItems<M: CollectMode> {
type OwnedItem;
type BorrowedItem<'a>
where
Self: 'a;

type IntoItems: IntoIterator<Item = Self::OwnedItem>;
type IterItems<'a>: Iterator<Item = Self::BorrowedItem<'a>>
where
Self: 'a;

fn into_items(self) -> Self::IntoItems;
fn iter_items(&self) -> Self::IterItems<'_>;
}
3 changes: 1 addition & 2 deletions libft-api/src/api/campus/campus_id.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use rsb_derive::Builder;
use serde::{Deserialize, Serialize};

Expand All @@ -14,7 +13,7 @@ pub struct FtApiCampusIdRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiCampusIdResponse {
pub campus: Vec<FtCampus>,
Expand Down
4 changes: 1 addition & 3 deletions libft-api/src/api/campus/campus_id_journals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ use tracing::debug;
use crate::prelude::*;
use crate::to_param;

use libft_api_derive::HasVector;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiCampusIdJournalsRequest {
pub user_id: Option<FtUserId>,
Expand All @@ -20,7 +18,7 @@ pub struct FtApiCampusIdJournalsRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiCampusIdJournalsResponse {
pub journals: Vec<FtJournal>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/campus/campus_id_locations.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;
use rsb_derive::Builder;
use serde::{Deserialize, Serialize};
use tracing::debug;
Expand All @@ -16,7 +16,7 @@ pub struct FtApiCampusIdLocationsRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiCampusIdLocationsResponse {
pub location: Vec<FtLocation>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/campus/campus_id_users.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;
use rsb_derive::Builder;
use serde::{Deserialize, Serialize};

Expand All @@ -15,7 +15,7 @@ pub struct FtApiCampusIdUsersRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiCampusIdUsersResponse {
pub users: Vec<FtUser>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/campus/campus_users.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiCampusUsersRequest {
Expand All @@ -15,7 +15,7 @@ pub struct FtApiCampusUsersRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiCampusUsersResponse {
pub campus_users: Vec<FtCampusUser>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/cursus/cursus_id_projects.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiCursusIdProjectsRequest {
Expand All @@ -16,7 +16,7 @@ pub struct FtApiCursusIdProjectsRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiCursusIdProjectsResponse {
pub projects: Vec<FtProject>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/exam/exams.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiExamsRequest {
Expand All @@ -24,7 +24,7 @@ pub struct FtApiExamsUsersPostBody {
pub user_id: FtUserId,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiExamsResponse {
pub exams: Vec<FtExam>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/group/groups.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiGroupsRequest {
Expand All @@ -30,7 +30,7 @@ pub struct FtApiGroupsUsersPostResponse {
pub group: FtGroup,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiGroupsResponse {
pub groups: Vec<FtGroup>,
Expand Down
5 changes: 4 additions & 1 deletion libft-api/src/api/prelude.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,7 @@ pub use super::project_user::*;
pub use super::scale_team::*;
pub use super::user::*;

pub use super::HasVec;
pub use super::Entries;
pub use super::HasItems;
pub use super::Values;
pub use libft_api_derive::HasItems;
4 changes: 2 additions & 2 deletions libft-api/src/api/project/project_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiProjectDataRequest {
Expand All @@ -16,7 +16,7 @@ pub struct FtApiProjectDataRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiProjectDataResponse {
pub project_data: Vec<FtProjectData>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/project/projects.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiProjectRequest {
Expand All @@ -16,7 +16,7 @@ pub struct FtApiProjectRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiProjectResponse {
pub projects: Vec<FtProject>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/project/projects_id_teams.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;
use rsb_derive::Builder;
use serde::{Deserialize, Serialize};

Expand All @@ -15,7 +15,7 @@ pub struct FtApiProjectsIdTeamsRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiProjectsIdTeamsResponse {
pub teams: Vec<FtTeam>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;
use rsb_derive::Builder;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiProjectSessionsScaleTeamsResponse {
pub scale_teams: Vec<FtScaleTeam>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiProjectSessionsTeamsResponse {
pub teams: Vec<FtTeam>,
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/project_user/projects_users.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;
use rsb_derive::Builder;
use serde::{Deserialize, Serialize};

Expand Down Expand Up @@ -31,7 +31,7 @@ pub struct FtApiProjectsUsersRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiProjectsUsersResponse {
pub projects_users: Vec<FtProjectsUser>,
Expand Down
6 changes: 3 additions & 3 deletions libft-api/src/api/scale_team/scale_teams.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;
use rsb_derive::Builder;

use serde::{Deserialize, Serialize};
Expand All @@ -14,7 +14,7 @@ pub struct FtApiScaleTeamsRequest {
pub per_page: Option<u8>,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiScaleTeamsResponse {
pub scale_teams: Vec<FtScaleTeam>,
Expand All @@ -31,7 +31,7 @@ pub struct FtApiScaleTeamsMultipleCreateBody {
pub team_id: FtTeamId,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiScaleTeamsMultipleCreateResponse {
pub scale_teams: Vec<FtScaleTeam>,
Expand Down
2 changes: 1 addition & 1 deletion libft-api/src/api/user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
//!
//! // Get a user's location data
//! let location_response = session.users_id_locations(FtApiUsersIdLocationsRequest::new(FtUserId::new(12345))).await?;
//! println!("Found {} location records", location_response.get_vec().len());
//! println!("Found {} location records", location_response.iter_items().len());
//! # Ok(())
//! # }
//! # tokio::runtime::Runtime::new().unwrap().block_on(run()).unwrap();
Expand Down
4 changes: 2 additions & 2 deletions libft-api/src/api/user/users.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};

use crate::prelude::*;
use crate::to_param;
use libft_api_derive::HasVector;
use libft_api_derive::HasItems;

#[derive(Debug, Serialize, Deserialize, Builder)]
pub struct FtApiUsersPostRequest {
Expand Down Expand Up @@ -38,7 +38,7 @@ pub struct FtApiUserPostsResponse {
pub user: FtUser,
}

#[derive(Debug, Serialize, Deserialize, Builder, HasVector)]
#[derive(Debug, Serialize, Deserialize, Builder, HasItems)]
#[serde(transparent)]
pub struct FtApiUsersResponse {
pub users: Vec<FtUser>,
Expand Down
Loading
Loading