Comments (2)
This is really cool! (And perhaps somewhat related to #12 and #26).
Something I didn't want to replicate from Akka is the very easy-to-trigger ignored directive since its valid syntax to forget ~
. It looks like this doesn't suffer from that.
I haven't built a large app with Akka, but when looking at the examples, it felt like the nested directive style would get very unwieldy with larger and larger apps. Have you noticed that?
from warp.
Something I didn't want to replicate from Akka is the very easy-to-trigger ignored directive since its valid syntax to forget
~
. It looks like this doesn't suffer from that.
Yep. In Scala it is easier to miss the separator because the ;
is optional, so you don't get any help from the compiler. The issue is easier to detect with tests, but still a bit unfortunate.
I haven't built a large app with Akka, but when looking at the examples, it felt like the nested directive style would get very unwieldy with larger and larger apps. Have you noticed that?
You can split the route in multiple functions/files, and put part of its logic in small functions.
Thus, the route tree contains only the declarations to “interpret” the request. The code is also much easier to understand and to maintain.
For example:
// Auth.scala
case class Auth(...) {
def userAuthenticator(creds: Credentials): Future[Option[User]] = ???
// Directive to authenticate users
def requireUser = authenticateBasicAsync(realm = "API", userAuthenticator)
}
// ProjecsAPI.scala
case class ProjecsAPI(...) {
val auth = Auth()
def listProjects(user: User) = ???
def findProject(user: User, projectId: Int): Future[Option[Project]] = ???
def deleteProject(project: Project): Future[Unit] = ???
// Routes for /projects
def routes = pathPrefix("projects") {
auth.requireUser { user =>
pathEnd {
complete(listProjects(user))
} ~
path(IntNumber) { projectId =>
onSuccess(findProject(user, projectId)) {
case None =>
complete(NotFound)
case Some(project) =>
get {
complete(project)
} ~
delete {
onSuccess(deleteProject(project)) {
complete(NoContent)
}
}
}
}
}
}
}
// UsersAPI.scala
case class UsersAPI(...) {
val auth = Auth()
// Routes for /users
def routes = pathPrefix("users") {
auth.requireUser { user =>
path("current") {
complete(user)
}
}
}
}
// Main.scala
val routes = (
ProjecsAPI().routes ~
UsersAPI().routes
// ~ More().routes
)
Http().bindAndHandle(routes, "0.0.0.0", 8080)
from warp.
Related Issues (20)
- Feature request: Fallible extractor filter
- Clarify API docs around multipart forms HOT 2
- Feature request: More customization points in tracing HOT 2
- EC Private key support HOT 1
- Make `Option<F>` a filter when F is a filter
- Feature request: `warp::make_service()` or `warp::service_with_addr()`
- CVE-2023-43669/GHSA-9mcr-873m-xcxp: tungstenite <= 0.20.0 DoS vulnerability HOT 1
- [feature request] [low prio] Non-Metal fallback option HOT 2
- SSE gives up on Streams that return Pending HOT 3
- Server::run should return ! (never type)
- Default OS / self signed certificate without create it HOT 1
- websocket disconnect (code: 1006, reason: "") HOT 2
- Add `rust-version` into `Cargo.toml` HOT 1
- Error `connection closed before message completed` after 60s HOT 2
- Websocket connection closes immediately, but not with firefox HOT 4
- Navigation between panes using vim commands HOT 1
- examples/tls/cert.pem has expired
- Upgrade to hyper v1 HOT 4
- key contains no private key while using ecc key HOT 1
- integrate with monoio
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from warp.