Giter Club home page Giter Club logo

Comments (8)

TheNeikos avatar TheNeikos commented on June 12, 2024

cc @Boscop @matthiasbeyer

from rustbreak.

Boscop avatar Boscop commented on June 12, 2024

Thanks! I'll be porting my code to v2..

Btw, in v1 I was storing different types (structs) as values in the db, how would you recommend doing the same in v2? (without introducing an enum with a case for each struct that could occur, because I'm doing it in a general way and the only info I have about the struct is that it is Serialize+Deserialize and has a name (via the TypeName trait)).

I want to keep serializing/deserializing my structs in a general way, I have to port this v1 code:

pub mod disk_cache {
	lazy_static! {
		static ref DB: Database<String> = Database::open(env::var("DISK_CACHE_PATH").unwrap()).unwrap();
	}
	pub fn load<T: Default + TypeName>() -> T where for<'de> T: Deserialize<'de> {
		DB.retrieve(T::type_name()).unwrap_or(T::default())
	}
	pub fn try_load<T: TypeName>() -> Option<T> where for<'de> T: Deserialize<'de> {
		DB.retrieve(T::type_name()).ok()
	}
	pub fn store<'de, T: Serialize + TypeName>(x: T) -> rustbreak::Result<()> {
		DB.insert(T::type_name(), x)
	}
	pub fn save() -> rustbreak::Result<()> {
		DB.flush()
	}
	pub fn contains_key<T: TypeName>() -> rustbreak::Result<bool> {
		DB.contains_key::<(), _>(T::type_name())
	}
}

pub trait PersistRepr: ToFrm + TypeName {
	fn try_load() -> Option<Self>;
	fn persist(self);
}

impl<T: ToFrm + TypeName> PersistRepr for T {
	fn try_load() -> Option<Self> {
		println!("{}::try_load()", Self::type_name());
		if disk_cache::contains_key::<Self>().unwrap() {
			Some(disk_cache::try_load().unwrap())
		} else {
			None
		}
	}
	fn persist(self) {
		println!("{}::persist()", Self::type_name());
		disk_cache::store(self).unwrap();
	}
}

from rustbreak.

Boscop avatar Boscop commented on June 12, 2024

Would it work in v2 with a HashMap<String, Box<Serialize + Deserialize>> for the db?

from rustbreak.

TheNeikos avatar TheNeikos commented on June 12, 2024

I don't think so as is, as Serialize and Deserialize is not object safe. If you want the same functionality you will need to have a HashMap<String, Vec<u8>> and encode it in what you want to have, and decode that when needed. Which is what v1 did.

Another thing you could do is to use a serde_json::Value and then cast that using from_value when you need it.

from rustbreak.

Boscop avatar Boscop commented on June 12, 2024

But it should work with Serialize + Deserialize from erased-serde, right?

from rustbreak.

Boscop avatar Boscop commented on June 12, 2024

Ah no, only auto traits can be used for + Trait :(

And it looks like serde_json::Value is not Serialize + Deserialize, so it can't be used, right?

from rustbreak.

TheNeikos avatar TheNeikos commented on June 12, 2024

https://docs.serde.rs/serde_json/value/enum.Value.html#impl-Deserialize%3C%27de%3E

From what I can see it has both.

from rustbreak.

Boscop avatar Boscop commented on June 12, 2024

Ah thanks, I was looking at the derives...

from rustbreak.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.