Project skeleton
This commit is contained in:
commit
b5aacb5896
18 changed files with 310 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[workspace]
|
||||||
|
members = [
|
||||||
|
"lib/puppy",
|
||||||
|
"lib/store",
|
||||||
|
"lib/fetch",
|
||||||
|
"bin/server",
|
||||||
|
"bin/pupctl",
|
||||||
|
]
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# ActivityPuppy
|
||||||
|
|
||||||
|
✨ Puppy, fetch my posts!
|
8
bin/pupctl/Cargo.toml
Normal file
8
bin/pupctl/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "pupctl"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
puppy = { path = "../../lib/puppy" }
|
||||||
|
clap = { version = "*", features = ["derive"] }
|
||||||
|
cli-table = "*"
|
3
bin/pupctl/src/main.rs
Normal file
3
bin/pupctl/src/main.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
fn main() {
|
||||||
|
println!("pupctl")
|
||||||
|
}
|
8
bin/server/Cargo.toml
Normal file
8
bin/server/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "server"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
puppy = { path = "../../lib/puppy" }
|
||||||
|
tokio = { version = "*", features = ["full"] }
|
||||||
|
axum = "*"
|
8
bin/server/src/main.rs
Normal file
8
bin/server/src/main.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
use axum::{routing::get, Router};
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
let app = Router::new().route("/", get(|| async { "Hello, World!" }));
|
||||||
|
let sock = tokio::net::TcpListener::bind("0.0.0.0:1312").await.unwrap();
|
||||||
|
axum::serve(sock, app).await.unwrap();
|
||||||
|
}
|
95
flake.lock
Normal file
95
flake.lock
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705309234,
|
||||||
|
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710765496,
|
||||||
|
"narHash": "sha256-p7ryWEeQfMwTB6E0wIUd5V2cFTgq+DRRBz2hYGnJZyA=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "e367f7a1fb93137af22a3908f00b9a35e2d286a7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706487304,
|
||||||
|
"narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "90f456026d284c22b3e3497be980b2e47d0b28ac",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oxalica": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710727870,
|
||||||
|
"narHash": "sha256-Ulsx+t4SnRmjMJx4eF2Li+3rBGYhZp0XNShVjIheCfg=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "a1b17cacfa7a6ed18f553a195a047f4e73e95da9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"oxalica": "oxalica"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
21
flake.nix
Normal file
21
flake.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = github:NixOS/nixpkgs;
|
||||||
|
oxalica.url = github:oxalica/rust-overlay;
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { nixpkgs, oxalica, ... }: let
|
||||||
|
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [(import oxalica)]; };
|
||||||
|
in{
|
||||||
|
devShell."x86_64-linux" = pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
(rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override {
|
||||||
|
extensions = [ "rust-src" "rustfmt" "rust-analyzer" ];
|
||||||
|
}))
|
||||||
|
openssl
|
||||||
|
pkg-config
|
||||||
|
evcxr
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
lib/fetch/Cargo.toml
Normal file
11
lib/fetch/Cargo.toml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "fetch"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
reqwest = "*"
|
||||||
|
sigh = "*"
|
||||||
|
serde_json = "*"
|
0
lib/fetch/src/lib.rs
Normal file
0
lib/fetch/src/lib.rs
Normal file
10
lib/puppy/Cargo.toml
Normal file
10
lib/puppy/Cargo.toml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[package]
|
||||||
|
name = "puppy"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
store = { path = "../store" }
|
||||||
|
fetch = { path = "../fetch" }
|
1
lib/puppy/src/lib.rs
Normal file
1
lib/puppy/src/lib.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
9
lib/store/Cargo.toml
Normal file
9
lib/store/Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "store"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
ulid = "*"
|
27
lib/store/src/key.rs
Normal file
27
lib/store/src/key.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
pub const NODE: usize = 16;
|
||||||
|
pub const EDGE: usize = NODE * 2;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub struct Key<const SIZE: usize = NODE>([u8; SIZE]);
|
||||||
|
|
||||||
|
impl<const S: usize> AsRef<[u8]> for Key<S> {
|
||||||
|
fn as_ref(&self) -> &[u8] {
|
||||||
|
self.0.as_ref()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Key {
|
||||||
|
pub fn join(self, other: Key) -> Key<EDGE> {
|
||||||
|
unsafe { std::mem::transmute((self, other)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Key<EDGE> {
|
||||||
|
pub fn split(self) -> (Key, Key) {
|
||||||
|
unsafe { std::mem::transmute_copy(&self.0) }
|
||||||
|
}
|
||||||
|
pub fn swap(self) -> Key<EDGE> {
|
||||||
|
let (l, r) = self.split();
|
||||||
|
r.join(l)
|
||||||
|
}
|
||||||
|
}
|
24
lib/store/src/lib.rs
Normal file
24
lib/store/src/lib.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
pub struct Store {}
|
||||||
|
|
||||||
|
pub use key::Key;
|
||||||
|
|
||||||
|
mod key;
|
||||||
|
|
||||||
|
pub mod transaction;
|
||||||
|
|
||||||
|
/// An (optionally labeled) directed edge between two keys.
|
||||||
|
pub trait Arrow {
|
||||||
|
/// Additional data associated with this edge.
|
||||||
|
type Label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A simple value associated with a key.
|
||||||
|
pub trait Value {}
|
||||||
|
|
||||||
|
/// Aliases are unique mappings/indices that can be used in place of a key.
|
||||||
|
///
|
||||||
|
/// They typically take the form of a newtype to add semantic meaning.
|
||||||
|
pub trait Alias {}
|
||||||
|
|
||||||
|
/// Results from this component.
|
||||||
|
type Result<T, E = ()> = std::result::Result<T, E>;
|
69
lib/store/src/transaction.rs
Normal file
69
lib/store/src/transaction.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
use crate::{Alias, Arrow, Key, Result, Value};
|
||||||
|
|
||||||
|
pub struct Transaction;
|
||||||
|
|
||||||
|
/// Operations on [values][Value].
|
||||||
|
impl Transaction {
|
||||||
|
pub fn lookup_value<V>(&self, key: Key) -> Result<(Key, V)>
|
||||||
|
where
|
||||||
|
V: Value,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
pub fn insert_value<V>(&self, key: Key) -> Result<()>
|
||||||
|
where
|
||||||
|
V: Value,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
pub fn update_value<V>(&self, key: Key) -> Result<()>
|
||||||
|
where
|
||||||
|
V: Value,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
pub fn delete_value<V>(&self, key: Key) -> Result<()>
|
||||||
|
where
|
||||||
|
V: Value,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Operations on [arrows][Arrow].
|
||||||
|
impl Transaction {
|
||||||
|
pub fn create_arrow<A>(&self, key: (Key, Key), label: A::Label) -> Result<()>
|
||||||
|
where
|
||||||
|
A: Arrow,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
pub fn delete_arrow<A>(&self, key: (Key, Key)) -> Result<()>
|
||||||
|
where
|
||||||
|
A: Arrow,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
pub fn arrow_exists<A>(&self, key: (Key, Key)) -> Result<bool>
|
||||||
|
where
|
||||||
|
A: Arrow,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Operations on [aliases][Alias].
|
||||||
|
impl Transaction {
|
||||||
|
pub fn create_alias<A>(&self, key: Key, alias: A) -> Result<()>
|
||||||
|
where
|
||||||
|
A: Alias,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
pub fn delete_alias<A>(&self, alias: A)
|
||||||
|
where
|
||||||
|
A: Alias,
|
||||||
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
4
rustfmt.toml
Normal file
4
rustfmt.toml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
unstable_features = true
|
||||||
|
overflow_delimited_expr = true
|
||||||
|
group_imports = "StdExternalCrate"
|
||||||
|
use_field_init_shorthand = true
|
Loading…
Reference in a new issue