1use anyhow::Result;
2
3use crate::Client;
4#[derive(Clone, Debug)]
5pub struct Users {
6 pub client: Client,
7}
8
9impl Users {
10 #[doc(hidden)]
11 pub fn new(client: Client) -> Self {
12 Self { client }
13 }
14
15 #[doc = "List users\n\nA List of users\n- Requires: `API Tier 1`\n- Sortable fields: `id`, `created_at`, `updated_at`\n\n**Parameters:**\n\n- `cursor: Option<String>`\n- `order_by: Option<String>`\n\n```rust,no_run\nuse futures_util::TryStreamExt;\nasync fn example_users_list_stream() -> anyhow::Result<()> {\n let client = rippling_api::Client::new_from_env();\n let mut users = client.users();\n let mut stream = users.list_stream(Some(\"some-string\".to_string()));\n loop {\n match stream.try_next().await {\n Ok(Some(item)) => {\n println!(\"{:?}\", item);\n }\n Ok(None) => {\n break;\n }\n Err(err) => {\n return Err(err.into());\n }\n }\n }\n\n Ok(())\n}\n```"]
16 #[tracing::instrument]
17 pub async fn list<'a>(
18 &'a self,
19 cursor: Option<String>,
20 order_by: Option<String>,
21 ) -> Result<crate::types::ListUsersResponse, crate::types::error::Error> {
22 let mut req = self.client.client.request(
23 http::Method::GET,
24 format!("{}/{}", self.client.base_url, "users"),
25 );
26 req = req.bearer_auth(&self.client.token);
27 let mut query_params = vec![];
28 if let Some(p) = cursor {
29 query_params.push(("cursor", p));
30 }
31
32 if let Some(p) = order_by {
33 query_params.push(("order_by", p));
34 }
35
36 req = req.query(&query_params);
37 let resp = req.send().await?;
38 let status = resp.status();
39 if status.is_success() {
40 let text = resp.text().await.unwrap_or_default();
41 serde_json::from_str(&text).map_err(|err| {
42 crate::types::error::Error::from_serde_error(
43 format_serde_error::SerdeError::new(text.to_string(), err),
44 status,
45 )
46 })
47 } else {
48 let text = resp.text().await.unwrap_or_default();
49 Err(crate::types::error::Error::Server {
50 body: text.to_string(),
51 status,
52 })
53 }
54 }
55
56 #[doc = "List users\n\nA List of users\n- Requires: `API Tier 1`\n- Sortable fields: `id`, `created_at`, `updated_at`\n\n**Parameters:**\n\n- `cursor: Option<String>`\n- `order_by: Option<String>`\n\n```rust,no_run\nuse futures_util::TryStreamExt;\nasync fn example_users_list_stream() -> anyhow::Result<()> {\n let client = rippling_api::Client::new_from_env();\n let mut users = client.users();\n let mut stream = users.list_stream(Some(\"some-string\".to_string()));\n loop {\n match stream.try_next().await {\n Ok(Some(item)) => {\n println!(\"{:?}\", item);\n }\n Ok(None) => {\n break;\n }\n Err(err) => {\n return Err(err.into());\n }\n }\n }\n\n Ok(())\n}\n```"]
57 #[tracing::instrument]
58 #[cfg(not(feature = "js"))]
59 pub fn list_stream<'a>(
60 &'a self,
61 order_by: Option<String>,
62 ) -> impl futures::Stream<Item = Result<crate::types::User, crate::types::error::Error>> + Unpin + '_
63 {
64 use futures::{StreamExt, TryFutureExt, TryStreamExt};
65
66 use crate::types::paginate::Pagination;
67 self.list(None, order_by)
68 .map_ok(move |result| {
69 let items = futures::stream::iter(result.items().into_iter().map(Ok));
70 let next_pages = futures::stream::try_unfold(
71 (None, result),
72 move |(prev_page_token, new_result)| async move {
73 if new_result.has_more_pages()
74 && !new_result.items().is_empty()
75 && prev_page_token != new_result.next_page_token()
76 {
77 async {
78 let mut req = self.client.client.request(
79 http::Method::GET,
80 format!("{}/{}", self.client.base_url, "users"),
81 );
82 req = req.bearer_auth(&self.client.token);
83 let mut request = req.build()?;
84 request = new_result.next_page(request)?;
85 let resp = self.client.client.execute(request).await?;
86 let status = resp.status();
87 if status.is_success() {
88 let text = resp.text().await.unwrap_or_default();
89 serde_json::from_str(&text).map_err(|err| {
90 crate::types::error::Error::from_serde_error(
91 format_serde_error::SerdeError::new(
92 text.to_string(),
93 err,
94 ),
95 status,
96 )
97 })
98 } else {
99 let text = resp.text().await.unwrap_or_default();
100 Err(crate::types::error::Error::Server {
101 body: text.to_string(),
102 status,
103 })
104 }
105 }
106 .map_ok(|result: crate::types::ListUsersResponse| {
107 Some((
108 futures::stream::iter(result.items().into_iter().map(Ok)),
109 (new_result.next_page_token(), result),
110 ))
111 })
112 .await
113 } else {
114 Ok(None)
115 }
116 },
117 )
118 .try_flatten();
119 items.chain(next_pages)
120 })
121 .try_flatten_stream()
122 .boxed()
123 }
124
125 #[doc = "Retrieve a specific user\n\nRetrieve a specific user\n\n**Parameters:**\n\n- `id: \
126 &'astr`: ID of the resource to return (required)\n\n```rust,no_run\nasync fn \
127 example_users_get() -> anyhow::Result<()> {\n let client = \
128 rippling_api::Client::new_from_env();\n let result: \
129 rippling_api::types::GetUsersResponse = client\n .users()\n \
130 .get(\"d9797f8d-9ad6-4e08-90d7-2ec17e13471c\")\n .await?;\n \
131 println!(\"{:?}\", result);\n Ok(())\n}\n```"]
132 #[tracing::instrument]
133 pub async fn get<'a>(
134 &'a self,
135 id: &'a str,
136 ) -> Result<crate::types::GetUsersResponse, crate::types::error::Error> {
137 let mut req = self.client.client.request(
138 http::Method::GET,
139 format!(
140 "{}/{}",
141 self.client.base_url,
142 "users/{id}".replace("{id}", id)
143 ),
144 );
145 req = req.bearer_auth(&self.client.token);
146 let resp = req.send().await?;
147 let status = resp.status();
148 if status.is_success() {
149 let text = resp.text().await.unwrap_or_default();
150 serde_json::from_str(&text).map_err(|err| {
151 crate::types::error::Error::from_serde_error(
152 format_serde_error::SerdeError::new(text.to_string(), err),
153 status,
154 )
155 })
156 } else {
157 let text = resp.text().await.unwrap_or_default();
158 Err(crate::types::error::Error::Server {
159 body: text.to_string(),
160 status,
161 })
162 }
163 }
164}