trifid/trifid-api/src/cursor.rs

40 lines
1.1 KiB
Rust
Raw Normal View History

2023-04-03 22:39:49 +00:00
use std::error::Error;
use base64::Engine;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Cursor {
pub page: u64
}
impl TryFrom<Cursor> for String {
type Error = Box<dyn Error>;
fn try_from(value: Cursor) -> Result<Self, Self::Error> {
// Serialize it to json
let json_str = serde_json::to_string(&value)?;
// Then base64-encode the json
let base64_str = base64::engine::general_purpose::STANDARD.encode(json_str);
Ok(base64_str)
}
}
impl TryFrom<String> for Cursor {
type Error = Box<dyn Error>;
fn try_from(value: String) -> Result<Self, Self::Error> {
if value.is_empty() {
// If empty, it's page 0
return Ok(Cursor {
page: 0
})
}
// Base64-decode the value
let json_bytes = base64::engine::general_purpose::STANDARD.decode(value)?;
// Convert it into a string
let json_str = String::from_utf8(json_bytes)?;
// Deserialize it from json
let cursor = serde_json::from_str(&json_str)?;
Ok(cursor)
}
}