+58
-41
README.md
+58
-41
README.md
···-[](https://crates.io/crates/jacquard) [](https://docs.rs/jacquard) [](./LICENSE)-- Validated, spec-compliant, easy to work with, and performant baseline types (including typed at:// uris)-- either the codegen produces code that's easy to work with, or there are good handwritten wrappers-Dead simple API client. Logs in with an app password and prints the latest 5 posts from your timeline.···+Jacquard is broken up into several crates for modularity. The correct one to use is generally `jacquard` itself, as it re-exports the others.+- `jacquard`: Main crate [](https://crates.io/crates/jacquard) [](https://docs.rs/jacquard)+- `jacquard-api`: Autogenerated API bindings [](https://crates.io/crates/jacquard-api) [](https://docs.rs/jacquard-api)+- `jacquard-oauth`: atproto OAuth implementation [](https://crates.io/crates/jacquard-oauth) [](https://docs.rs/jacquard-oauth)+- `jacquard-identity`: Identity resolution [](https://crates.io/crates/jacquard-identity) [](https://docs.rs/jacquard-identity)+- `jacquard-lexicon`: Lexicon parsing and code generation [](https://crates.io/crates/jacquard-lexicon) [](https://docs.rs/jacquard-lexicon)+- `jacquard-derive`: Derive macros for lexicon types [](https://crates.io/crates/jacquard-derive) [](https://docs.rs/jacquard-derive)···There's also a [`justfile`](https://just.systems/) for Makefile-esque commands to be run inside of the devShell, and you can generally `cargo ...` or `just ...` whatever just fine if you don't want to use Nix and have the prerequisites installed.
+7
crates/jacquard-oauth/src/atproto.rs
+7
crates/jacquard-oauth/src/atproto.rs
···
+176
-176
crates/jacquard-oauth/src/request.rs
+176
-176
crates/jacquard-oauth/src/request.rs
······
+2
-2
crates/jacquard-oauth/src/scopes.rs
+2
-2
crates/jacquard-oauth/src/scopes.rs
···-//! Derived from https://tangled.org/@smokesignal.events/atproto-identity-rs/raw/main/crates/atproto-oauth/src/scopes.rs+//! Derived from <https://tangled.org/@smokesignal.events/atproto-identity-rs/raw/main/crates/atproto-oauth/src/scopes.rs>
+58
-52
crates/jacquard/src/lib.rs
+58
-52
crates/jacquard/src/lib.rs
···-//! - Validated, spec-compliant, easy to work with, and performant baseline types (including typed at:// uris)-//! - either the codegen produces code that's easy to work with, or there are good handwritten wrappers···//! - Stateful client (app-password): `CredentialSession<S, T>` where `S: SessionStore<(Did, CowStr), AtpSession>` and-//! `T: IdentityResolver + HttpClient + XrpcExt`. It auto-attaches Authorization, refreshes on expiry, and updates the+//! `T: IdentityResolver + HttpClient`. It auto-attaches bearer authorization, refreshes on expiry, and updates the+//! - Stateful client (OAuth): `OAuthClient<S, T>` and `OAuthSession<S, T>` where `S: ClientAuthStore` and+//! `T: OAuthResolver + HttpClient`. The client is used to authenticate, returning a session which handles authentication and token refresh internally.+//! - `Agent<A: AgentSession>` Session abstracts over the above two options. Currently it is a thin wrapper, but this will be the thing that gets all the convenience helpers.···-//! - For persistence, wrap the file store: `FileAuthStore::new(path)` implements SessionStore for app-password sessions···
+35
-16
crates/jacquard/src/main.rs
+35
-16
crates/jacquard/src/main.rs
······