Atproto, Router, add atproto api mod with Nsid
Sets up a generic atproto module to store atproto implementation. Mainly doing this so that I can switch between rsky/atrium as well as add my own layers on top. This also switches the old Xrpc/Router use of Nsid to the atproto api implementation of it. Next up is the DB where I'll need a bunch of these.
This commit is contained in:
parent
d4a3a71e2f
commit
db33099405
6 changed files with 858 additions and 32 deletions
830
rust/Cargo.lock
generated
830
rust/Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -6,9 +6,11 @@ edition = "2021"
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
atrium-api = { version = "0.25.2", default-features = false }
|
||||
axum = { version = "0.8.3", features = ["json"] }
|
||||
axum-macros = "0.5.0"
|
||||
http = "1.3.1"
|
||||
serde = "1.0.219"
|
||||
serde_json = "1.0.140"
|
||||
sqlx = { version = "0.8.5", features = ["runtime-tokio"] }
|
||||
sqlx = { version = "0.8.5", features = ["postgres", "runtime-tokio"] }
|
||||
tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] }
|
||||
|
|
|
|||
1
rust/src/atproto.rs
Normal file
1
rust/src/atproto.rs
Normal file
|
|
@ -0,0 +1 @@
|
|||
pub use atrium_api::types::string::Nsid;
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
use crate::router::{
|
||||
use crate::{
|
||||
atproto::Nsid,
|
||||
router::{
|
||||
Router,
|
||||
Endpoint,
|
||||
xrpc::{
|
||||
|
|
@ -7,18 +9,21 @@ use crate::router::{
|
|||
Response,
|
||||
error,
|
||||
},
|
||||
},
|
||||
};
|
||||
use axum::http::StatusCode;
|
||||
|
||||
use http::status::StatusCode;
|
||||
|
||||
mod atproto;
|
||||
mod router;
|
||||
mod db;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let mut router = Router::new();
|
||||
router = router.add_endpoint(Endpoint::new_xrpc_query(String::from("me.woach.get"), test));
|
||||
router = router.add_endpoint(Endpoint::new_xrpc_procedure(String::from("me.woach.post"), test2));
|
||||
let get_nsid = Nsid::new(String::from("me.woach.get")).expect("me.woach.get is a valid nsid");
|
||||
let post_nsid = Nsid::new(String::from("me.woach.post")).expect("me.woach.post is a valid nsid");
|
||||
router = router.add_endpoint(Endpoint::new_xrpc_query(get_nsid, test));
|
||||
router = router.add_endpoint(Endpoint::new_xrpc_procedure(post_nsid, test2));
|
||||
router.serve().await;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,11 @@
|
|||
use crate::router::xrpc::{
|
||||
XrpcEndpoint,
|
||||
XrpcHandler,
|
||||
QueryInput,
|
||||
ProcedureInput,
|
||||
use crate::{
|
||||
atproto::Nsid,
|
||||
router::xrpc::{
|
||||
XrpcEndpoint,
|
||||
XrpcHandler,
|
||||
QueryInput,
|
||||
ProcedureInput,
|
||||
}
|
||||
};
|
||||
use axum::Router as AxumRouter;
|
||||
use core::net::SocketAddr;
|
||||
|
|
@ -19,13 +22,13 @@ pub enum Endpoint {
|
|||
Xrpc(XrpcEndpoint),
|
||||
}
|
||||
impl Endpoint {
|
||||
pub fn new_xrpc_query<Q>(nsid: String, query: Q) -> Self
|
||||
pub fn new_xrpc_query<Q>(nsid: Nsid, query: Q) -> Self
|
||||
where
|
||||
Q: XrpcHandler<QueryInput> + Clone
|
||||
{
|
||||
Endpoint::Xrpc(XrpcEndpoint::new_query(nsid,query))
|
||||
}
|
||||
pub fn new_xrpc_procedure<P>(nsid: String, procedure: P) -> Self
|
||||
pub fn new_xrpc_procedure<P>(nsid: Nsid, procedure: P) -> Self
|
||||
where
|
||||
P: XrpcHandler<ProcedureInput> + Clone
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
use crate::atproto::Nsid;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
pin::Pin,
|
||||
|
|
@ -26,13 +27,13 @@ use axum::{
|
|||
};
|
||||
use serde_json::{Value, json};
|
||||
|
||||
enum Nsid {
|
||||
Nsid(String),
|
||||
enum Path {
|
||||
Nsid(Nsid),
|
||||
NotImplemented,
|
||||
}
|
||||
|
||||
pub struct XrpcEndpoint {
|
||||
nsid: Nsid,
|
||||
path: Path,
|
||||
resolver: MethodRouter,
|
||||
}
|
||||
|
||||
|
|
@ -123,12 +124,12 @@ where
|
|||
}
|
||||
|
||||
impl XrpcEndpoint {
|
||||
pub fn new_query<Q>(nsid: String, query: Q) -> Self
|
||||
pub fn new_query<Q>(nsid: Nsid, query: Q) -> Self
|
||||
where
|
||||
Q: XrpcHandler<QueryInput> + Clone
|
||||
{
|
||||
XrpcEndpoint {
|
||||
nsid: Nsid::Nsid(nsid),
|
||||
path: Path::Nsid(nsid),
|
||||
resolver: get(async move | mut parts: Parts | -> Response {
|
||||
match QueryInput::from_request_parts(&mut parts, &()).await {
|
||||
Ok(qi) => query.call(qi).await,
|
||||
|
|
@ -138,12 +139,12 @@ impl XrpcEndpoint {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn new_procedure<P>(nsid: String, procedure: P) -> Self
|
||||
pub fn new_procedure<P>(nsid: Nsid, procedure: P) -> Self
|
||||
where
|
||||
P: XrpcHandler<ProcedureInput> + Clone
|
||||
{
|
||||
XrpcEndpoint {
|
||||
nsid: Nsid::Nsid(nsid),
|
||||
path: Path::Nsid(nsid),
|
||||
resolver: post(async move | req: Request | -> Response {
|
||||
match ProcedureInput::from_request(req, &()).await {
|
||||
Ok(pi) => procedure.call(pi).await,
|
||||
|
|
@ -154,9 +155,9 @@ impl XrpcEndpoint {
|
|||
}
|
||||
|
||||
pub fn add_to_router(self, router: axumRouter) -> axumRouter {
|
||||
let path = match self.nsid {
|
||||
Nsid::Nsid(s) => &("/xrpc/".to_owned() + &s),
|
||||
Nsid::NotImplemented => "/xrpc/{*nsid}",
|
||||
let path = match self.path {
|
||||
Path::Nsid(nsid) => &("/xrpc/".to_owned() + nsid.as_str()),
|
||||
Path::NotImplemented => "/xrpc/{*nsid}",
|
||||
};
|
||||
|
||||
router.route(path, self.resolver)
|
||||
|
|
@ -172,7 +173,7 @@ impl XrpcEndpoint {
|
|||
);
|
||||
|
||||
XrpcEndpoint {
|
||||
nsid: Nsid::NotImplemented,
|
||||
path: Path::NotImplemented,
|
||||
resolver: get(resolver.clone()).post(resolver),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue