############################################################################### # Release info: displayed between bars in the header ############################################################################### [release] version = "0.5.0-rc.2" date = "May 09, 2022" ############################################################################### # Top features: displayed in the header under the introductory text. ############################################################################### [[top_features]] title = "Type Safe" text = "From request to response Rocket ensures that your types mean something." image = "helmet" button = "Learn More" url = "overview/#how-rocket-works" [[top_features]] title = "Boilerplate Free" text = "Spend your time writing code that really matters, and let Rocket generate the rest." image = "robot-free" button = "See Examples" url = "overview/#anatomy-of-a-rocket-application" [[top_features]] title = "Easy To Use" text = "Simple, intuitive APIs make Rocket approachable, no matter your background." image = "sun" button = "Get Started" url = "guide" margin = 2 [[top_features]] title = "Extensible" text = "Create your own first-class primitives that any Rocket application can use." image = "telescope" button = "See How" url = "overview/#anatomy-of-a-rocket-application" margin = 9 ############################################################################### # Sections: make sure there are an odd number so colors work out. ############################################################################### [[sections]] title = "Hello, Rocket!" code = ''' #[macro_use] extern crate rocket; #[get("/hello//")] fn hello(name: &str, age: u8) -> String { format!("Hello, {} year old named {}!", age, name) } #[launch] fn rocket() -> _ { rocket::build().mount("/", routes![hello]) } ''' text = ''' This is a **complete Rocket application**. It does exactly what you would expect. If you were to visit **/hello/John/58**, you’d see: Hello, 58 year old named John! If someone visits a path with an `` that isn’t a `u8`, Rocket doesn’t blindly call `hello`. Instead, it tries other matching routes or returns a **404**. ''' [[sections]] title = "Forms? Check!" code = ''' #[derive(FromForm)] struct Task<'r> { #[field(validate = len(1..))] description: &'r str, completed: bool } #[post("/", data = "")] fn new(task: Form>) -> Flash { Flash::success(Redirect::to(uri!(home)), "Task added.") } ''' text = ''' Form handling **is simple, declarative, and complete**: derive [`FromForm`](@api/rocket/derive.FromForm.html) for your structure and set the `data` parameter to a `Form` type. Rocket automatically **parses and validates** the form data into your structure and calls your function. Bad form request? Rocket doesn’t call your function! Need to know what went wrong? Use a `data` parameter of `Result`! Want to rerender the form with user input and errors? Use [`Context`](guide/requests/#context)! File uploads? A breeze with [`TempFile`](@api/rocket/fs/enum.TempFile.html). ''' [[sections]] title = "JSON, out of the box." code = ''' #[derive(Serialize, Deserialize)] struct Message<'r> { contents: &'r str, } #[put("/", data = "")] fn update(db: &Db, id: Id, msg: Json>) -> Value { if db.contains_key(&id) { db.insert(id, msg.contents); json!({ "status": "ok" }) } else { json!({ "status": "error" }) } } ''' text = ''' Rocket has first-class support for JSON, right out of the box. Simply derive `Deserialize` or `Serialize` to receive or return JSON, respectively. Look familiar? Forms, JSON, and all kinds of body data types work through Rocket’s [`FromData`](@api/rocket/data/trait.FromData.html) trait, Rocket’s approach to deriving types from body data. A `data` route parameter can be _any_ type that implements `FromData`. A value of that type will be deserialized automatically from the incoming request body. You can even implement `FromData` for your own types! ''' ############################################################################### # Bottom features: displayed above the footer. ############################################################################### [[bottom_features]] title = 'Templating' text = "Rocket makes templating a breeze with built-in templating support." image = 'templating-icon' url = 'guide/responses/#templates' button = 'Learn More' color = 'blue' [[bottom_features]] title = 'Cookies' text = "View, add, or remove cookies, with or without encryption, without hassle." image = 'cookies-icon' url = 'guide/requests/#cookies' button = 'Learn More' color = 'purple' margin = -6 [[bottom_features]] title = 'Async Streams' text = "Create and return potentially infinite async streams of data with ease." image = 'streams-icon' url = 'guide/responses/#async-streams' button = 'Learn More' color = 'red' margin = -29 [[bottom_features]] title = 'Config Profiles' text = "Configure your application your way for debug, release, or anything else!" image = 'config-icon' url = 'guide/configuration/#profiles' button = 'Learn More' color = 'yellow' margin = -3 [[bottom_features]] title = 'Testing Library' text = "Unit test your applications with ease using the built-in testing library." image = 'testing-icon' url = 'guide/testing#testing' button = 'Learn More' color = 'orange' [[bottom_features]] title = 'Typed URIs' text = "Rocket typechecks route URIs for you so you never mistype a URI again." image = 'ship-icon' url = 'guide/responses/#typed-uris' button = 'Learn More' color = 'green' margin = -20 # [[bottom_features]] # title = 'Query Strings' # text = "Handling query strings and parameters is type-safe and easy in Rocket." # image = 'query-icon' # url = 'guide/requests/#query-strings' # button = 'Learn More' # color = 'red' # margin = -3 # [[bottom_features]] # title = 'Private Cookies' # text = "Safe, secure, private cookies are built-in so your users can stay safe." # image = 'sessions-icon' # url = 'guide/requests/#private-cookies' # button = 'Learn More' # color = 'purple'