55 lines
1.9 KiB
Rust
55 lines
1.9 KiB
Rust
// trifid-api-old, an open source reimplementation of the Defined Networking nebula management server.
|
|
// Copyright (C) 2023 c0repwn3r
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
use base64::Engine;
|
|
use serde::{Deserialize, Serialize};
|
|
use std::error::Error;
|
|
|
|
#[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)
|
|
}
|
|
}
|