The backend of a gist server written in Rust
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

routes.rs 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. use diesel::result::Error;
  2. use rocket::http::Status;
  3. use rocket::response::status;
  4. use rocket_contrib::json::Json;
  5. use rocket_contrib::templates::Template;
  6. use std::collections::HashMap;
  7. use crate::connection::DbConn;
  8. use crate::gists;
  9. use crate::gists::{Gist, InsertableGist};
  10. fn error_response(error: Error) -> Status {
  11. match error {
  12. Error::NotFound => Status::NotFound,
  13. _ => Status::InternalServerError,
  14. }
  15. }
  16. #[get("/")]
  17. pub fn index(connection: DbConn) -> Result<Json<Vec<Gist>>, Status> {
  18. gists::all(&connection)
  19. .map(|gists| Json(gists))
  20. .map_err(|error| error_response(error))
  21. }
  22. #[get("/gists/<id>")]
  23. pub fn show_gist(connection: DbConn, id: i32) -> Template {
  24. let gist = match gists::get(&connection, id) {
  25. Ok(gist) => Some(gist),
  26. Err(_) => None,
  27. };
  28. let mut context = HashMap::new();
  29. context.insert("gist", gist);
  30. Template::render("gists/show", &context)
  31. }
  32. #[post("/api/gists", format = "application/json", data = "<gist>")]
  33. pub fn create_gist<'a>(
  34. gist: Json<InsertableGist>,
  35. connection: DbConn,
  36. ) -> Result<status::Created<Json<Gist>>, Status> {
  37. gists::insert(gist.into_inner(), &connection)
  38. .map(|gist| status::Created(String::from(""), Some(Json(gist))))
  39. .map_err(|error| error_response(error))
  40. }