Crates.io | actix-storage |
lib.rs | actix-storage |
version | 0.3.0 |
source | src |
created_at | 2020-11-02 22:24:46.022917 |
updated_at | 2023-01-11 23:20:21.029304 |
description | General key value storage for actix-web |
homepage | |
repository | https://github.com/pooyamb/actix-storage/ |
max_upload_size | |
id | 308076 |
size | 80,470 |
Actix storage is a simple wrapper around some key-value storages to provide basic operations without knowing the backend in advance.
Actix-storage is meant to be used alongside one the implementer crates, ex:
# Cargo.toml
[dependencies]
actix-storage = "0.3.0"
actix-storage-hashmap = "0.3.0"
Or you want to use the serde based methods for typed information:
[dependencies]
actix-storage = {version = "0.3.0", features=["serde-json"]}
After you picked an implementer:
use actix_storage::{Storage, Format};
use actix_storage_hashmap::HashMapActor;
use actix_web::{App, HttpServer};
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// Intialize the implementer according to its docs
let store = HashMapActor::start_default();
// Give it to the Storage struct
let storage = Storage::build().expiry_store(store).finish();
// Or if it doesn't support expiring functionality
// it will give errors if those methods are called
let storage = Storage::build().store(store).finish();
// It is also possible to feed a seprate expiry,
// as long as it works on the same storage backend
let storage = Storage::build().expiry(expiry).finish();
// It is also possible to add a format to directly
// set and get values using serde.
let storage = Storage::build().store(expiry).format(Format::Json).finish();
// Store it in you application state with actix_web::App.app_data
let server = HttpServer::new(move || {
App::new()
.app_data(storage.clone())
});
server.bind("localhost:5000")?.run().await
}
And later in your handlers
async fn index(storage: Storage) -> Result<String, Error>{
storage.set_bytes("key", "value").await;
let val = storage.get_bytes("key").await?.unwrap_or_default();
// Or if you defined a serde format
let number: i32 = 5
storage.set("number", number);
let x: i32 = storage.get("number");
Ok(std::str::from_utf8(&val)
.map_err(|err| error::ErrorInternalServerError("Storage error"))?.to_string())
}
It can be usefull when:
If you really care about every drop of your application performance then actix-storage may not be for you, as it uses dynamic dispatching internally.
There are bunch of examples in the examples
folder, very basic ones thought, but it will give you the idea.
This project is licensed under either of
at your option.