bdo-rs

Crates.iobdo-rs
lib.rsbdo-rs
version0.0.1
created_at2026-01-05 03:42:15.050701+00
updated_at2026-01-05 03:42:15.050701+00
descriptionRust client SDK for BDO (Blockchain Data Objects) - a Planet Nine microservice for persistent data storage with cryptographic authentication
homepagehttps://planetnine.app
repositoryhttps://github.com/planet-nine-app/bdo
max_upload_size
id2023045
size69,234
Zach (zach-planet-nine)

documentation

https://docs.rs/bdo-rs

README

BDO Rust Client

This is the Rust client SDK for the BDO (Blockchain Data Objects) miniservice.

Installation

Add this to your Cargo.toml:

[dependencies]
bdo-rs = { path = "path/to/bdo-rs" }
sessionless = "0.x"
tokio = { version = "1", features = ["full"] }
serde_json = "1"

Usage

Basic Example

use bdo_rs::BDO;
use sessionless::Sessionless;
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Initialize sessionless for key management
    let sessionless = Sessionless::new();

    // Create BDO client (uses dev environment by default)
    let bdo = BDO::new(None, Some(sessionless));

    let hash = "this hash describes the context for this bdo";

    let new_bdo = json!({
        "you": "can",
        "put": "whatever",
        "you": {
            "want": "here",
            "so": "long",
            "as": "it's"
        },
        "an": "object"
    });

    // Create a new user
    let user = bdo.create_user(hash, &new_bdo, &false).await?;
    println!("Created user with UUID: {}", user.uuid);

    // Update the BDO
    let updated_bdo = json!({
        "put": "something else"
    });
    let updated_user = bdo.update_bdo(&user.uuid, hash, &updated_bdo, &false).await?;

    // Get the BDO back
    let retrieved_user = bdo.get_bdo(&user.uuid, hash).await?;
    println!("Retrieved BDO: {:?}", retrieved_user.bdo);

    // Delete the user
    let result = bdo.delete_user(&user.uuid, hash).await?;
    println!("User deleted: {}", result.success);

    Ok(())
}

Working with Emojicodes

Emojicodes are human-memorable identifiers for public BDOs. They consist of 8 emoji (3 base emoji + 5 unique emoji) and are automatically assigned when you create a public BDO.

use bdo_rs::BDO;
use sessionless::Sessionless;
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let sessionless = Sessionless::new();
    let bdo = BDO::new(None, Some(sessionless));

    let hash = "my_public_bdo";
    let pub_key = bdo.sessionless.public_key().to_hex();

    // Create a public BDO (automatically gets an emojicode)
    let public_bdo = json!({
        "name": "My Public Data",
        "description": "This is accessible via emojicode"
    });

    let user = bdo.create_user(hash, &public_bdo, &true).await?;

    // Retrieve BDO by emojicode (public BDOs only)
    let emojicode = "🌍🔑💎🌟💎🎨🐉📌"; // Example emojicode
    let response = bdo.get_bdo_by_emojicode(emojicode).await?;

    println!("Emojicode: {}", response.emojicode);
    println!("Public Key: {}", response.pub_key);
    println!("BDO: {:?}", response.bdo);
    println!("Created At: {}", response.created_at);

    Ok(())
}

Getting Public BDOs

// Get a public BDO using the pubKey parameter
let pub_key = "02a1b2c3..."; // Public key of the BDO owner
let public_user = bdo.get_public_bdo(&user_uuid, hash, pub_key).await?;

Working with Bases

Bases are Planet Nine base preferences:

use bdo_rs::Bases;
use serde_json::json;

// Get user's bases
let bases_value = bdo.get_bases(&user.uuid, hash).await?;

// Save bases
let new_bases = Bases {
    bases: json!({
        "base1": "data",
        "base2": "more_data"
    })
};
let saved_bases = bdo.save_bases(&user.uuid, hash, &new_bases).await?;

Working with Spellbooks

Spellbooks are used for the MAGIC protocol:

use bdo_rs::Spellbook;
use serde_json::json;

// Get user's spellbooks
let spellbooks = bdo.get_spellbooks(&user.uuid, hash).await?;
for spellbook in spellbooks {
    println!("Spellbook: {}", spellbook.spellbookName);
}

// Save a new spellbook
let new_spellbook = Spellbook {
    spellbookName: "MySpellbook".to_string(),
    spells: json!({
        "spell1": {
            "incantation": "abracadabra"
        }
    })
};
let updated_spellbooks = bdo.put_spellbook(&user.uuid, hash, &new_spellbook).await?;

Teleportation

The teleport feature validates teleportation tags with allyabase:// protocol support:

let teleport_url = "allyabase://some/resource";
let content = bdo.teleport(&user.uuid, hash, teleport_url).await?;
println!("Teleported content: {:?}", content);

API Reference

BDO Client

BDO::new(base_url: Option<String>, sessionless: Option<Sessionless>) -> Self

Creates a new BDO client instance.

  • base_url: Optional custom base URL (defaults to https://dev.bdo.allyabase.com/)
  • sessionless: Optional sessionless instance for key management (creates a new one if not provided)

create_user(&self, hash: &str, bdo: &Value, is_public: &bool) -> Result<BDOUser, Error>

Creates a new BDO user with an optional initial BDO.

update_bdo(&self, uuid: &str, hash: &str, bdo: &Value, is_public: &bool) -> Result<BDOUser, Error>

Updates or creates a BDO for an existing user.

get_bdo(&self, uuid: &str, hash: &str) -> Result<BDOUser, Error>

Retrieves a private BDO.

get_public_bdo(&self, uuid: &str, hash: &str, pub_key: &str) -> Result<BDOUser, Error>

Retrieves a public BDO using the pubKey parameter.

get_bdo_by_emojicode(&self, emojicode: &str) -> Result<EmojicodeResponse, Error>

Retrieves a public BDO by its emojicode. Returns the emojicode, public key, BDO data, and creation timestamp.

get_bases(&self, uuid: &str, hash: &str) -> Result<Value, Error>

Gets user's Planet Nine bases.

save_bases(&self, uuid: &str, hash: &str, bases: &Bases) -> Result<Value, Error>

Updates user's bases.

get_spellbooks(&self, uuid: &str, hash: &str) -> Result<Vec<Spellbook>, Error>

Gets user's spellbooks.

put_spellbook(&self, uuid: &str, hash: &str, spellbook: &Spellbook) -> Result<Vec<Spellbook>, Error>

Stores a user spellbook.

delete_user(&self, uuid: &str, hash: &str) -> Result<SuccessResult, Error>

Deletes a user account. Returns a SuccessResult indicating if the operation succeeded.

teleport(&self, uuid: &str, hash: &str, url: &str) -> Result<Value, Error>

Validates teleportation tags with allyabase:// protocol support.

Data Structures

BDOUser

pub struct BDOUser {
    pub uuid: String,
    pub bdo: Value
}

EmojicodeResponse

pub struct EmojicodeResponse {
    pub emojicode: String,
    pub pub_key: String,
    pub bdo: Value,
    pub created_at: i64
}

Spellbook

pub struct Spellbook {
    pub spellbookName: String,
    #[serde(flatten)]
    spells: serde_json::Value
}

Bases

pub struct Bases {
    pub bases: serde_json::Value
}

SuccessResult

pub struct SuccessResult {
    pub success: bool
}

Environment

By default, the client connects to the development BDO server at https://dev.bdo.allyabase.com/. To use a different environment, pass a custom base URL when creating the client:

let bdo = BDO::new(Some("https://prod.bdo.allyabase.com/".to_string()), Some(sessionless));

Testing

Run the test suite:

cargo test

License

[Your License Here]

Commit count: 0

cargo fmt