diff options
| -rw-r--r-- | src/ugc.rs | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -25,6 +25,11 @@ const UGCQueryHandleInvalid: u64 = 0xffffffffffffffff; #[derive(Clone, Copy, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct PublishedFileId(pub u64); +impl From<u64> for PublishedFileId { + fn from(id: u64) -> Self { + PublishedFileId(id) + } +} /// Workshop item types to search for #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -107,6 +112,29 @@ impl Into<sys::EWorkshopFileType> for FileType { } } } +impl From<sys::EWorkshopFileType> for FileType { + fn from(file_type: sys::EWorkshopFileType) -> FileType { + match file_type { + sys::EWorkshopFileType::k_EWorkshopFileTypeCommunity => FileType::Community, + sys::EWorkshopFileType::k_EWorkshopFileTypeMicrotransaction => FileType::Microtransaction, + sys::EWorkshopFileType::k_EWorkshopFileTypeCollection => FileType::Collection, + sys::EWorkshopFileType::k_EWorkshopFileTypeArt => FileType::Art, + sys::EWorkshopFileType::k_EWorkshopFileTypeVideo => FileType::Video, + sys::EWorkshopFileType::k_EWorkshopFileTypeScreenshot => FileType::Screenshot, + sys::EWorkshopFileType::k_EWorkshopFileTypeGame => FileType::Game, + sys::EWorkshopFileType::k_EWorkshopFileTypeSoftware => FileType::Software, + sys::EWorkshopFileType::k_EWorkshopFileTypeConcept => FileType::Concept, + sys::EWorkshopFileType::k_EWorkshopFileTypeWebGuide => FileType::WebGuide, + sys::EWorkshopFileType::k_EWorkshopFileTypeIntegratedGuide => FileType::IntegratedGuide, + sys::EWorkshopFileType::k_EWorkshopFileTypeMerch => FileType::Merch, + sys::EWorkshopFileType::k_EWorkshopFileTypeControllerBinding => FileType::ControllerBinding, + sys::EWorkshopFileType::k_EWorkshopFileTypeSteamworksAccessInvite => FileType::SteamworksAccessInvite, + sys::EWorkshopFileType::k_EWorkshopFileTypeSteamVideo => FileType::SteamVideo, + sys::EWorkshopFileType::k_EWorkshopFileTypeGameManagedItem => FileType::GameManagedItem, + _ => unreachable!() + } + } +} /// AppID filter for queries. /// The "consumer" app is the app that the content is for. @@ -1177,6 +1205,7 @@ impl<'a> QueryResults<'a> { num_children: raw_details.m_unNumChildren, tags, tags_truncated: raw_details.m_bTagsTruncated, + file_type: raw_details.m_eFileType.into() }) } } @@ -1186,6 +1215,26 @@ impl<'a> QueryResults<'a> { (0..self.returned_results()) .map(move |i| self.get(i)) } + + /// Returns the given index's children as a list of PublishedFileId. + /// + /// You must call `include_children(true)` before fetching the query for this to work. + /// + /// Returns None if the index was out of bounds. + pub fn get_children(&self, index: u32) -> Option<Vec<PublishedFileId>> { + let num_children = self.get(index)?.num_children; + let mut children: Vec<sys::PublishedFileId_t> = vec![0; num_children as usize]; + + let ok = unsafe { + sys::SteamAPI_ISteamUGC_GetQueryUGCChildren(self.ugc, self.handle, index, children.as_mut_ptr(), num_children) + }; + + if ok { + Some(children.into_iter().map(Into::into).collect()) + } else { + None + } + } } /// Query result @@ -1205,6 +1254,7 @@ pub struct QueryResult { pub accepted_for_use: bool, pub tags: Vec<String>, pub tags_truncated: bool, + pub file_type: FileType, pub url: String, pub num_upvotes: u32, |