diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-07 22:56:34 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-07 22:56:34 +0100 |
commit | 02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3 (patch) | |
tree | 10362c18bccf2e9690d78844a7ff3ca403f7a126 /client/src/download.rs | |
parent | 745c0ff9cfb27381114ce832baed3b57a2e4b4f6 (diff) | |
download | weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.bz2 weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.zst |
static typing for resources
Diffstat (limited to 'client/src/download.rs')
-rw-r--r-- | client/src/download.rs | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/client/src/download.rs b/client/src/download.rs index 95f9cc7..e65ef25 100644 --- a/client/src/download.rs +++ b/client/src/download.rs @@ -17,9 +17,9 @@ use crate::network::Network; use anyhow::Result; use log::debug; -use std::collections::HashSet; +use std::{collections::HashSet, marker::PhantomData}; use weareshared::{ - packets::{Packet, Resource}, + packets::{Packet, ReadWrite, Resource}, store::{ResourceStore, sha256}, }; @@ -39,9 +39,14 @@ impl Downloader { store, } } - pub fn try_get(&mut self, hash: Resource) -> Result<Option<Vec<u8>>> { + pub fn try_get<T: ReadWrite>(&mut self, hash: Resource<T>) -> Result<Option<T>> { + self.try_get_raw(Resource(hash.0, PhantomData))? + .map(|x| T::read(&mut x.as_slice())) + .transpose() + } + pub fn try_get_raw(&mut self, hash: Resource) -> Result<Option<Vec<u8>>> { if self.have.contains(&hash) { - self.store.get(hash) + self.store.get_raw(hash) } else { self.need.insert(hash); Ok(None) @@ -50,8 +55,8 @@ impl Downloader { pub fn packet(&mut self, p: &Packet) -> Result<()> { match p { Packet::RespondResource(d) => { - let key = Resource(sha256(&d.0)); - self.store.set(&d.0)?; + let key = Resource(sha256(&d.0), PhantomData); + self.store.set_raw(&d.0)?; self.need.remove(&key); self.pending.remove(&key); if self.have.insert(key) { |