You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Paste Cynic generated query in src/queries/my_query.rs
Remove duplicate structs featured in src/queries/commons.rs
Remove lifetime &str and such
Create impl and struct in models.rs
example
usecrate::queries::cat::AnnouncementasSourceAnnouncement;#[derive(Debug)]#[cfg_attr( feature = "elixir_support", derive(rustler::NifStruct), module = "Kotkowo.Client.Announcement")]pubstructAnnouncement{pubid:Option<String>,pubtitle:String,pubimage:Option<Image>,}implFrom<SourceAnnouncement>forAnnouncement{fnfrom(value:SourceAnnouncement) -> Self{letSourceAnnouncement{ title, image, .. } = value;let image:Option<Image> = image.try_into().ok();Announcement{id:None,// we will skip the id for now
title,
image,}}}
Create a function in lib.rs
example
pubfnlist_announcement(options:Options<AnnouncementFiltersInput>,) -> Result<Paged<Announcement>,Error>{use cynic::http::ReqwestBlockingExt;use cynic::QueryBuilder;use queries::announcement::{ListAnnouncements,ListAnnouncementsVariables};let endpoint = "https://kotkowo-admin.ravensiris.xyz/graphql";let pagination = options.pagination;let sort:Option<Vec<Option<String>>> = match options.sort{
empty if empty.is_empty() => None,
otherwise => Some(otherwise.into_iter().map(Some).collect()),};let vars = ListAnnouncementsVariables{filters:None,// The Announcements won't need filtering so we omit it here
pagination,
sort,};let vars_str = serde_json::to_string(&vars);let operation = ListAnnouncements::build(vars);let query = operation.query.clone();let client = get_client()?;let response = client
.post(endpoint).run_graphql(operation).context(CynicRequestSnafu{})?;ifletSome(err) = response.errors{let message = format!("Variables:\n{}\nGraphQL:\n{}\nError:\n{:?}",
vars_str.unwrap(),
query,
err
).to_string();returnErr(Error::RequestResultedInError{ message });}let source_announcements = response
.data.context(MissingAttributeSnafu{})?
.announcements.context(MissingAttributeSnafu{})?;let meta = source_announcements.meta;let announcements:Result<Vec<Announcement>,Error> = source_announcements
.data.into_iter().map(|announcement_entity| {let id = announcement_entity.id.map(|id| id.into_inner());
announcement_entity
.attributes.context(MissingAttributeSnafu{}).map(|announcement| Announcement{
id,
..announcement.into()})}).collect();let page:Paged<Announcement> = Paged::new(meta.pagination, announcements?);Ok(page)}