From 18ec4e6d818e297a633b515d9f80aaa650adced1 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Mon, 2 Dec 2024 18:49:41 +0100 Subject: [PATCH 01/13] Add 'Trash in, Treasure out' blog post --- src/posts/2024-12-02-trash-in-treasure-out.md | 744 ++++++++++++++++++ 1 file changed, 744 insertions(+) create mode 100644 src/posts/2024-12-02-trash-in-treasure-out.md diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md new file mode 100644 index 0000000000..a1fbc721bd --- /dev/null +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -0,0 +1,744 @@ +# Trash in, treasure out + +*Making your API clear and robust with Rust's type system* + +By now, you're probably aware that at Mainmatter, we like Rust a lot. If you +aren't: [have a look at our Rust page](https://mainmatter.com/rust-consulting/). +In this blog post, I'd like to highlight one of my favorite traits of Rust (yes +pun intended): its focus on _correctness_. Rust has a very expressive type +system that lets you offload many checks to the compiler: it supports generics, +data-carrying enums, closures, visibility specifiers, _explicit_ conversions, and +much more. These are neat features that make performant, low-level programming +feel as ergonomic as high-level languages. Sure, Rust has a learning curve, and +thatlearning curve is a result of Rust's tendency to make complexity really _in +your face_. + +Make no mistake, every piece of software is complex: it has to run on +computers, which, especially nowadays are complex beasts. And writing +software with highly optimized languages with manual memory management like +C, C++, or Rust requires knowledge of all kinds of subtleties. Rust makes these +subtleties _explicit_, forcing you to fix all kinds of things you may never +have thought of before even compiling your code. + +But that's not all: as projects grow and age and more people work on the same +piece of software, communication becomes very important. And by communication I +mean ensuring the original writer of some piece of code, the code reviewer, the +user of the code's API, the colleague refactoring the codebase, and new +developers are on the same page about the _intent_ and _invariants_ of that +code. What is this code doing? How am I supposed to use it correctly? What +happens if I mess up? How do I protect this API from input it might choke on? +Traditionally, one would write in documentation and code comments the answers +to these and many other questions. Writing documentation is a very valuable +job, but sadly, developers are human. And humans make mistakes. And if the +humans think they _themselves_ don't make mistakes, they will surely agree +that their colleagues _do_. + +Documentation written in human language needs to be clear, specific, and up-to- +date. And even if it's written well, for it to do its job, documentation needs +to be _read_ in the first place. And even if it _is_ read, it needs to be +interpreted and acted upon correctly. I don't know about you, but I'm way too +pedantic to see that go flawlessly. + +Now, this is why I like Rust's expressive type system: it lets me encode a great +deal of the semantics I'd otherwise have to describe in the documentation. You +can craft your APIs and types such that using your library or module becomes +very hard or even impossible. You can encode the _intent_ and _invariants_ +regarding your code using the type system. This way you get the Rust compiler +on _your_ side. It will be able to pick up subtle errors caused by your API +users holding it wrong. And it will do so _at compile time_, greatly shortening +the feedback loop. It makes adding features, refactoring, and reviewing much +less error-prone. And it's great for security as well. It's where coding meets +art, really. + +In this article, I'd like to give three main pieces of advice: +1. Encode the semantics/states of your application in the type system and your + API. +2. Ensure input gets parsed into rigid structs before acceptance. +3. Ensure output gets encoded in the correct format and doesn’t leak (sensitive) + information. + +## Ticket to heaven +We'll need a case to show how all this works, and since Mainmatter loves the +travel industry, let's write up an API for booking train tickets. + +Looking at different train ticket services, in general, the steps towards booking +are pretty similar: first, you enter the location you want to depart from and +where you want to go, then you enter either your preferred moment of departure +or when you want to arrive. Next, you select one of several suggested trips and +enter your personal information. With all the information complete, you're all +set to book the ticket and pay. Here's what that looks like as a flowchart: + +```mermaid +--- +title: Ticket office +--- +flowchart TD + Origin(Select origin) --> + Destination(Select destination) --> + DepartureTimestamp(Enter departure timestamp) --> Trip + Destination --> ArrivalTimestamp(Enter arrival timestamp) --> Trip + Trip(Select trip) --> + Class(Select class) --> + Name(Enter name) --> + Email(Enter email) --> + PhoneNumber(Enter phone number) --> + Book(Book and pay) +``` + +Pretty straightforward, right? Let's code one up. + +## Setting up +Let's set up a simple [`axum`]-based server to implement before flow. I'm only +going to post the code relevant to the story here, but if you're interested in +the whole shebang: check out the code for [step 0]. Here's what the app setup +looks like: + +```rust +// src/lib.rs + +pub async fn run() -> Result<()> { + // Setup router + let router = axum::Router::new() + .route("/origin", post(set_origin)) + .route("/destination", post(set_destination)) + .route("/departure", post(set_departure)) + .route("/arrival", post(set_arrival)) + .route("/trips", get(list_trips)) + .route("/trip", post(set_trip)) + .route("/class", post(set_class)) + .route("/name", post(set_name)) + .route("/email", post(set_email)) + .route("/phone_number", post(set_phone_number)) + .route("/book_trip", post(book_trip)); + + // Create in-memory session store + let session_store: SessionNullSessionStore = SessionStore::new(None, SessionConfig::default()) + .await + .unwrap(); + + // Stitch them together + let app = router + .layer(SessionLayer::new(session_store)) + .into_make_service(); + + // Aand serve! + let listener = TcpListener::bind("0.0.0.0:3000").await?; + axum::serve(listener, app).await?; + + Ok(()) +} +``` + +As you can see, we've got routes for each step, as well as a basic in-memory +session store. For now, the handlers are pretty similar. Here's `set_origin`: + +```rust +// src/lib.rs + +async fn set_origin(session: Session, origin: String) -> Result> { + Ok(session.get_or_init_state(|s| { + s.origin = Some(origin); + })) + .map(Json) +} +``` + +If you're not familiar with [`axum`]: this handler extracts the session out of +the session layer, and gives us the request body as a `String`. +`Session::get_or_init_state` fetches the current state from the session store, +and updates it with the closure passed to it. If there's no session yet, it +creates a default one, that it passes to the closure. + +So what's this `TicketMachine` in the route handler example? Well, it's the +representation of the state of the booking flow. Here's the definition: + +```rust +// src/ticket_machine.rs + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + pub origin: Option, + pub destination: Option, + pub departure: Option, + pub arrival: Option, + pub trip: Option, + pub class: Option, + pub name: Option, + pub email: Option, + pub phone_number: Option, + pub payment_info: Option, +} +``` + +Pretty much a bunch of optional strings. Does it work, though? Well, let's also +create a little integration test: + +```rust +// tests/main.rs + +#[tokio::test] +async fn test_set_origin() { + let body: TicketMachine = send_post_request(&http_client(), "/origin", "Amsterdam").await; + assert_eq!( + body, + TicketMachine { + origin: Some("Amsterdam".to_owned()), + ..Default::default() + } + ) +} +``` + +Nothing too surprising. `http_client` sets up a [`reqwest`] HTTP client, and +the `send_post_request` helper function sends a POST request to our server, +given the path (`"/origin"`) and the body (`"Amsterdam"`). Now, let's give it a +spin. In one terminal window, we start the server, and we'll run the tests in a +separate terminal window: + +```bash +// start server +$ cargo run +[..] +``` + +I'm using [`cargo-nextest`] because it gives me pretty and concise reports. + +```bash +// Run tests +$ cargo nextest run + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.06s +------------ + Nextest run ID 2b617168-9190-4619-ba1d-27a3e6cdc815 with nextest profile: default + Starting 1 test across 3 binaries + PASS [ 0.016s] takeoff::main test_set_origin +------------ + Summary [ 0.017s] 1 test run: 1 passed, 0 skipped +``` + +> 1 test run: 1 passed + +I like that! + +## Looking back +Our route handler doesn't do a lot. It will accept any `String` for a body, +meaning that as far as our app is concerned `"πŸš‚-πŸ›’-πŸ›’-πŸ›’"` is totally a valid +origin. It's nice that given a string [must be valid UTF-8][String], at least our +handler won't accept random byte sequences, but we can do better. For the +curious among you: the following code is in the [step 1] commit. Let's add some +validation: + +```rust +// src/lib.rs + +pub fn is_valid_location(location: &str) -> bool { + const VALID_LOCATIONS: &[&str] = &[ + "Amsterdam Centraal", + "Paris Nord", + "Berlin Hbf", + "London Waterloo", + ]; + + VALID_LOCATIONS.contains(&location) +} + +// βœ‚οΈ + +async fn set_origin(session: Session, origin: String) -> Result> { + if !is_valid_location(&origin) { + return Err(Error::BadRequest("Invalid origin!")); + } + + Ok(session.get_or_init_state(|s| { + s.origin = Some(origin); + })) + .map(Json) +} +``` + +And test some more: + +```bash +$ cargo nextest run +Finished `test` profile [unoptimized + debuginfo] target(s) in 0.06s +------------ +Nextest run ID 3437f17c-6fed-4b9b-8fad-27b324e45602 with nextest profile: default +Starting 1 test across 3 binaries + FAIL [ 0.014s] takeoff::main test_set_origin + +--- STDOUT: takeoff::main test_set_origin --- + + + +--- STDERR: takeoff::main test_set_origin --- +thread 'test_set_origin' panicked at tests/main.rs:34:9: +Received error response (reqwest::Error { kind: Status(400), url: "http://localhost:3000/origin" }): 'Bad Request: Invalid origin!' +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + +Cancelling due to test failure +------------ + Summary [ 0.015s] 1 test run: 0 passed, 1 failed, 0 skipped + FAIL [ 0.014s] takeoff::main test_set_origin +error: test run failed +``` + +Yay! It fails! Surprise: turns out there's no station called "Amsterdam". We +should update the test again: + +```rust +// tests/main.rs + +#[test_case(b"Amsterdam" => panics ""; "Non-existent station")] +#[test_case("πŸš‚-πŸ›’-πŸ›’-πŸ›’".as_bytes() => panics ""; "Emojional roller coaster")] +#[test_case(&[0xE0, 0x80, 0x80] => panics "" ; "Non-UTF-8 sequence")] +#[test_case(b"Amsterdam Centraal"; "Valid station")] +#[tokio::test] +async fn test_set_bad_origin(origin: &'static [u8]) { + let body: TicketMachine = send_post_request("/origin", origin).await; + assert_eq!( + body, + TicketMachine { + origin: Some(String::from_utf8(origin.to_vec()).unwrap()), + ..Default::default() + } + ) +} +``` + +And those, believe me, totally pass! Now what? + +## Even better validation +We can do better still. Here's the thing: for our server to validate locations +_everywhere_, we'd need to add loads of calls to `is_valid_location`. What +happens if I forget, though? This is where Rust's expressive type system comes +in. With Rust, you can create types that are valid _by construction_. The mere +fact that such an instance of such type exists, proves that it is valid. And +this is truly an amazing power. How do you do it? Well, by using the [newtype] +pattern: + +```rust +// src/types/location.rs + +pub struct Location(String); +``` + +The code for this section can be found in the repo state as of the [step 2] +commit. + +Now, wrapping a struct in and of itself is not too useful. But we already did +something very important: give the type a good name, adding semantics! Now, of +course, you'd add some doc comments describing the type some more, but already +it's clear what this type is meant to represent. There's no way to instantiate +it from outside the `types::location` module, though. On the one hand, that's +great: right now there's no way to instantiate an invalid `Location`. However, +it'd be a huge improvement if we could create _valid_ `Location`s. So let's add +some methods and trait implementations: + +```rust +// src/types/location.rs + +#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +#[serde(try_from = "String")] +pub struct Location(String); + +impl Location { + pub fn is_valid_location(location: &str) -> bool { + const VALID_LOCATIONS: &[&str] = &[ + "Amsterdam Centraal", + "Paris Nord", + "Berlin Hbf", + "London Waterloo", + ]; + + VALID_LOCATIONS.contains(&location) + } +} + +impl TryFrom for Location { + type Error = ParseLocationError; + + fn try_from(s: String) -> Result { + if !Self::is_valid_location(&s) { + return Err(ParseLocationError(s)); + } + Ok(Self(s)) + } +} + +#[derive(Debug, thiserror::Error)] +#[error("Error parsing location: {0}")] +pub struct ParseLocationError(String); +``` + +Much better! Using the `#[serde(try_from = "String")]` attribute, we've +instructed `serde` to call the `Location::try_from` implementation upon +deserialization. Now, the _only_ way to instantiate a `Location` is through it's +`TryFrom` implementation, which does the validation. Barring any unsafe +magic tricks, that is. Getting the value _out_ is a matter of adding more +functionality, which I won't bore you with right now. But you can imagine adding +an implementation for `std::fmt::Display`, or a method +`fn as_str(&self) -> &str`. Don't go implement `std::ops::Deref` +though, that'd [defeat the purpose][deref_polymorphism]. + +With that set up, let's update our model, as well as the relevant method +handlers. Here's our freshly updated `TicketMachine`, which got moved to the +`crate::types::ticket_machine` module: + +```rust +// src/types/ticket_machine.rs +use crate::types::location::Location; + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + pub origin: Option, + pub destination: Option, + // βœ‚οΈ ..other fields +} +``` + +Here's `set_origin`: + +```rust +// src/lib.rs + +async fn set_origin(session: Session, Json(origin): Json) -> Result> { + Ok(session.get_or_init_state(|s| { + s.origin = Some(origin); + })) + .map(Json) +} +``` + +As you can see, instead of taking a `String` body, this time we're taking a +`Json`. Axum will attempt to deserialize the request body into a +`Location`, and the `Json<_>` extractor tells it that it should use `serde_json` +to do so. And as `serde_json` is going to use the `serde::Deserialize` +implementation we derived on `Location` before, `Location::try_from` +gets run even the _before_ code within the route handler is run. So within the +route handler, we're _certain_ that the `origin` parameter represents a valid +`Location`! + +Now, of course, our test is just sending plain, unquoted strings, and unquoted +strings are not valid JSON. So let's update our test: + +```rust +// tests/main.rs + +fn json_string_bytes(s: &str) -> Cow<'static, [u8]> { + serde_json::to_vec(s).unwrap().into() +} + +#[test_case(json_string_bytes("Amsterdam") => panics ""; "Non-existent station")] +#[test_case(json_string_bytes("πŸš‚-πŸ›’-πŸ›’-πŸ›’") => panics ""; "Emojional roller coaster")] +#[test_case([0xE0, 0x80, 0x80].as_slice().into() => panics "" ; "Non-UTF-8 sequence")] +#[test_case(b"Amsterdam Centraal".into() => panics ""; "Invalid JSON")] +#[test_case(json_string_bytes("Amsterdam Centraal"); "Valid station")] +#[tokio::test] +async fn test_set_bad_origin(origin: Cow<'static, [u8]>) { + let origin = origin.to_vec(); + let body: TicketMachine = send_post_request("/origin", origin.clone()).await; + + let origin: String = serde_json::from_slice(&origin).expect( + "The request should have failed at this point as `origin` was not valid JSON anyway", + ); + let origin: Location = origin.try_into().unwrap(); + + assert_eq!( + body, + TicketMachine { + origin: Some(origin), + ..Default::default() + } + ) +} +``` + +We're now sending JSON! The signature changed a bit: instead of a +`&'static [u8]`, it now takes a `Cow<'static, [u8]>`, which helps with our JSON +serialization stuff, but let's not focus on that. Instead, I'm gonna distract +you with the test results: + +```bash +$ cargo nextest run + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.10s +------------ + Nextest run ID a7be105d-a24b-44e9-baba-c5a560608792 with nextest profile: default + Starting 5 tests across 3 binaries + PASS [ 0.045s] takeoff::main test_set_bad_origin::valid_station + PASS [ 0.046s] takeoff::main test_set_bad_origin::non_existent_station + PASS [ 0.046s] takeoff::main test_set_bad_origin::non_utf_8_sequence + PASS [ 0.046s] takeoff::main test_set_bad_origin::invalid_json + PASS [ 0.046s] takeoff::main test_set_bad_origin::emojional_roller_coaster +------------ + Summary [ 0.047s] 5 tests run: 5 passed, 0 skipped +``` + +There we go! With that set up, we have the following guarantees within the +`set_origin` method handler regarding the request body: + +- It's valid UTF-8; +- It's valid JSON; +- It represents a valid `Location`, as defined in its `TryFrom` + implementation. + +And it's all checked by Rust's type system! We might as well throw out the cases +that pass in non-UTF-8 sequences or invalid JSON: the only really sensible +part to test is the implementation of `TryFrom`. But let's keep them +anyway because tests are great to have when doing big code refactors. + +## Output sanitization +So far, Rust's type system has been working for us very well to give us +guarantees about input. How about output though? Using the [`newtype`] pattern +from the previous section again, we can ensure sensitive data gets hidden in +responses and logs. Furthermore, we can make the output encoding format part of +our type zoo. Let me remind you what our `TicketOffice` model looks like so far: + +```rust +// src/types/ticket_machine.rs + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + pub origin: Option, + pub destination: Option, + pub departure: Option, + pub arrival: Option, + pub trip: Option, + pub class: Option, + pub name: Option, + pub email: Option, + pub phone_number: Option, + pub payment_info: Option, +} +``` + +The first thing you'll notice is that we aren't doing any input validation +for the fields other than `origin` and `destination`. But other than that, our +struct holds some sensitive personal data: `name`, `email`, `phone_number`, and +`payment_info`. Let's focus on that last field, `payment_info`, though. We +haven't specified yet what `payment_info` _is_, but let's assume for now that it +may contain credit card details. Now, credit card details are things you don't +want ending up in your logs or API responses. Using the [`newtype`] pattern, we +can make it _hard_ to leak such data into the logs. The following examples can +be found in the repo state as of the [step 3] commit. Let's conjure up a +`PaymentInfo` type: + +```rust +// src/types/payment_info.rs + +#[derive(Clone, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +#[serde(into = "String")] +pub struct PaymentInfo(String); + +impl std::fmt::Display for PaymentInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "") + } +} + +impl std::fmt::Debug for PaymentInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple(stringify!(PaymentInfo)) + .field(&"") + .finish() + } +} + +impl From for String { + fn from(p: PaymentInfo) -> Self { + p.to_string() + } +} +``` + +This time, we've ensured the ways to convert `PaymentInfo` to a `String` are +watertight. Using the `#[serde(into = "String")]` attribute on the struct +definition, we've ensured that Serde uses the `Into` implementation on +`PaymentInfo` to serialize the struct, which gets forwarded to its `Display` +implementation. And that implementation hides our secrets. Nice! Accidentally +logging payment info is covered as well by the custom implementation of `Debug`. +Obviously, `PaymentInfo` requires input validation, too, but let's keep focus +on the output right now. + +Let's update our `TicketMachine` and the `book_trip` route handler: + +```rust +// src/types/ticket_machine.rs + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + // βœ‚οΈ ..other fields + pub payment_info: Option, +} + +// src/lib.rs + +async fn book_trip( + session: Session, + Json(payment_info): Json, +) -> Result> { + session + .update_state(|s| { + s.payment_info = Some(payment_info); + println!("πŸš‚ Trip booked! Choo choo!"); + }) + .ok_or(Error::BadRequest("Set phone_number first")) + .map(Json) +} +``` + +Great. We were already wrapping our output in a `Json`, ensuring the data gets +encoded in the right format before sending it out. Now we'll add some tests to +validate that this works: + +```rust +// tests/main.rs + +#[tokio::test] +async fn test_hiding_payment_details() { + let client = http_client(); + let origin = json!("Amsterdam Centraal"); + // Set up the session + let _: TicketMachine = + send_post_request(&client, "/origin", serde_json::to_vec(&origin).unwrap()).await; + + // Totally not _my_ credit card + let payment_info = json!({ + "card_number": "1234 5678 9012 3456", + "cvc": "123", + "exp": "12/34", + }) + .to_string(); + // Deserialize into a Value, so that we can skip any input validation on + // the test side. + let state: serde_json::Value = send_post_request( + &client, + "/book_trip", + serde_json::to_vec(dbg!(&payment_info)).unwrap(), + ) + .await; + + assert_eq!(state["payment_info"], ""); +} + +// src/types/payment_info.rs + +#[tokio::test] +async fn test_payment_details_debug_impl() { + use crate::types::ticket_machine::TicketMachine; + use std::fmt::Write; + + let ticket_machine = TicketMachine { + origin: None, + destination: None, + departure: None, + arrival: None, + trip: None, + class: None, + name: None, + email: None, + phone_number: None, + payment_info: Some("πŸ’°πŸ’°πŸ’°".to_owned().try_into().unwrap()), + }; + let mut dbg_output = String::new(); + write!(&mut dbg_output, "{ticket_machine:?}").unwrap(); + + assert_eq!( + dbg_output, + r#"TicketMachine { origin: None, destination: None, departure: None, arrival: None, trip: None, class: None, name: None, email: None, phone_number: None, payment_info: Some(PaymentInfo("")) }"# + ) +} +``` + +And test: + +```bash +$ cargo nextest run + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.38s +------------ + Nextest run ID 1ba4afd2-c85c-4817-8f6d-5d66090fb3a1 with nextest profile: default + Starting 7 tests across 3 binaries + PASS [ 0.015s] takeoff types::payment_info::test_payment_details_debug_impl + PASS [ 0.051s] takeoff::main test_set_bad_origin::valid_station + PASS [ 0.051s] takeoff::main test_set_bad_origin::invalid_json + PASS [ 0.051s] takeoff::main test_set_bad_origin::non_existent_station + PASS [ 0.051s] takeoff::main test_set_bad_origin::emojional_roller_coaster + PASS [ 0.051s] takeoff::main test_set_bad_origin::non_utf_8_sequence + PASS [ 0.052s] takeoff::main test_hiding_payment_details +------------ + Summary [ 0.052s] 7 tests run: 7 passed, 0 skipped +``` + +There you go! With that, we've ensured that once our `PaymentInfo` is +instantiated, it'll be quite hard to accidentally leak its contents. Completely +hiding the payment info from everything would make it rather unuseful, but at +least we can't accidentally log them or send them in a response, preventing a +very likely cause of leaking information. + +## Wrapping up +We've reached a lot already! We've created meaningful types for handling the +data in our model, ensured they're valid by construction, and that they don't +leak sensitive information. With that, our API has become much more robust than +the version we started out with. Let's summarize what we've achieved with that. + +In the [introduction](#trash-in-treasure-out), I listed three pieces of advice: + +> 1. Encode the semantics/states of your application in the type system and your + API. +> 2. Ensure input gets parsed into rigid structs before acceptance. +> 3. Ensure output gets encoded in the correct format and doesn’t leak + (sensitive) information. + +In [step 2](#even-better-validation), we've covered the first two points. +We started out creating an explicit `Location` type, with a name that clearly +indicates what it conveys. We've skipped adding documentation on that type, +but if we hadn't, it could describe the semantics and invariants of `Location` +some more. That documentation would be easily findable anywhere `Location` is +used. + +Furthermore, we ensured `Location`s are valid by construction: by implementing +the validation in the `TryFrom` implementation for `Location`, and +ensuring the `Location` can only be created and deserialized via that +validation, we've ensured that a `Location` _always_ represents a valid +location, *as long as our validation logic is correct*. And by accepting +`Json` in our Axum request handlers directly, those handlers don't +need to do any further validation. + +In [step 3](#output-sanitization), we've ensured the `PaymentDetails` can't leak +sensitive information in logs or responses by implementing `Debug` and `Display` +such that they don't actually use the wrapped `String`, and ensured the +`From` implementation for `String` uses our `Display` +implementation. We can add dedicated methods to get the data out in case we +need to store the payment details in our database, for instance. With that, +_accidentally_ leaking such info has become much harder. + +Are there any downsides? As always: yes, this is no silver bullet. One thing you +probably have noticed so far is that the patterns described in this post +introduce a bunch of boilerplate. There are crates (e.g. [`nutype`]) out there +that aim to reduce this, but they come with their own trade-offs. Furthermore, +sometimes not all invariants can be expressed in Rust code. In such cases, one +still has to rely on documentation to be thorough and correct. + +Other than that, rigidity may not always be what you want. Sometimes your +invariants and requirements are not all that clear, and are very subject to +change. In such cases, it's not great to update loads of boilerplate all the +time. This, I think, is a bit of a matter of taste: I myself like to force +myself to clarify the requirements and invariants before implementation, and +with the validation being implemented in a single place, updating that is not +such a big hassle. And what you get back is huge: correct, robust, clear, and +maintainable code! + +*In [step 4], I've updated the rest of the method handlers. Be sure to have a +look!* + + +[step 0]: todo +[step 1]: todo +[step 2]: todo +[step 3]: todo + +[`axum`]: https://crates.io/crates/axum/ +[`reqwest`]: https://crates.io/crates/reqwest/ +[`cargo-nextest`]: https://nexte.st/ +[String]: https://doc.rust-lang.org/stable/std/string/struct.String.html +[newtype]: https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html?highlight=newtype#newtype +[deref_polymorphism]: https://rust-unofficial.github.io/patterns/anti_patterns/deref.html +[`nutype`]: https://docs.rs/nutype/latest/nutype/ From f57ffcd5a97b7b13034e2a4759ec4a7177124c7b Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 10:44:57 +0100 Subject: [PATCH 02/13] Add links to steps --- src/posts/2024-12-02-trash-in-treasure-out.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index a1fbc721bd..f9bed8dce1 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -726,14 +726,14 @@ with the validation being implemented in a single place, updating that is not such a big hassle. And what you get back is huge: correct, robust, clear, and maintainable code! -*In [step 4], I've updated the rest of the method handlers. Be sure to have a -look!* +*In [step 4], I've updated the rest of the method handlers, and demonstrate the +[`validator`] and [`nutype`] crates briefly. Be sure to have a look!* - -[step 0]: todo -[step 1]: todo -[step 2]: todo -[step 3]: todo +[step 0]: https://github.com/mainmatter/trash-in-treasure-out/commit/abaa132a4250c71846ddf9a4540129af9952c9e8 +[step 1]: https://github.com/mainmatter/trash-in-treasure-out/commit/5c03b284bc0b1c932ec1c09b6abfef13f5cdfa4e +[step 2]: https://github.com/mainmatter/trash-in-treasure-out/commit/305b8088b5155aeb13a473ca398fd1d522405b7d +[step 3]: https://github.com/mainmatter/trash-in-treasure-out/commit/1dc8400afff4a31bcc1586e577a4af39124b8dfa +[step 4]: https://github.com/mainmatter/trash-in-treasure-out/commit/305b8088b5155aeb13a473ca398fd1d522405b7d [`axum`]: https://crates.io/crates/axum/ [`reqwest`]: https://crates.io/crates/reqwest/ @@ -741,4 +741,5 @@ look!* [String]: https://doc.rust-lang.org/stable/std/string/struct.String.html [newtype]: https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html?highlight=newtype#newtype [deref_polymorphism]: https://rust-unofficial.github.io/patterns/anti_patterns/deref.html -[`nutype`]: https://docs.rs/nutype/latest/nutype/ +[`nutype`]: https://crates.io/crates/nutype/ +[`validator`]: https://crates.io/crates/validator/ \ No newline at end of file From f8c2d7affbdf5a29171b526162ed53d83dc3b182 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 10:47:41 +0100 Subject: [PATCH 03/13] Refer to title --- src/posts/2024-12-02-trash-in-treasure-out.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index f9bed8dce1..17cfc816d7 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -27,11 +27,12 @@ user of the code's API, the colleague refactoring the codebase, and new developers are on the same page about the _intent_ and _invariants_ of that code. What is this code doing? How am I supposed to use it correctly? What happens if I mess up? How do I protect this API from input it might choke on? -Traditionally, one would write in documentation and code comments the answers -to these and many other questions. Writing documentation is a very valuable -job, but sadly, developers are human. And humans make mistakes. And if the -humans think they _themselves_ don't make mistakes, they will surely agree -that their colleagues _do_. +Because 'Garbage in, garbage out' is not a great philosophy when setting up +critical and robust systems. Traditionally, one would write in documentation and +code comments the answers to these and many other questions. Writing +documentation is a very valuable job, but sadly, developers are human. And +humans make mistakes. And if the humans think they _themselves_ don't make +mistakes, they will surely agree that their colleagues _do_. Documentation written in human language needs to be clear, specific, and up-to- date. And even if it's written well, for it to do its job, documentation needs From 0de9f3cfa6e52153caee95aff859ed201071cd70 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 10:58:56 +0100 Subject: [PATCH 04/13] add og:image and add post metadata --- src/posts/2024-12-02-trash-in-treasure-out.md | 19 ++++++++++++++++-- .../og-image.png | Bin 0 -> 65567 bytes 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 static/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index 17cfc816d7..a3fb91aed8 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -1,6 +1,21 @@ -# Trash in, treasure out +--- +title: "Trash in, treasure out" +authorHandle: hdoordt +tags: ["rust"] +bio: "Henk Oordt, Senior Software Engineering Consultant" +description: "Making your API clear and robust with Rust's type system" +og: + image: "/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png" +tagline: | +

+ Making your API clear and robust with Rust's type system. +

+ +image: "" +imageAlt: "" +--- -*Making your API clear and robust with Rust's type system* +## Intro By now, you're probably aware that at Mainmatter, we like Rust a lot. If you aren't: [have a look at our Rust page](https://mainmatter.com/rust-consulting/). diff --git a/static/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png b/static/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..b909eac15a5bf0a5204f1ea8841365ce71623488 GIT binary patch literal 65567 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%0AiTmONfz)!ibBfHT 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 literal 0 HcmV?d00001 From 5d96a7ad6695fdcf7e032fdc97a977172e3e4734 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 11:04:05 +0100 Subject: [PATCH 05/13] Apply suggestions from code review Co-authored-by: Marco Otte-Witte --- src/posts/2024-12-02-trash-in-treasure-out.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index a3fb91aed8..20e5149697 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -25,7 +25,7 @@ system that lets you offload many checks to the compiler: it supports generics, data-carrying enums, closures, visibility specifiers, _explicit_ conversions, and much more. These are neat features that make performant, low-level programming feel as ergonomic as high-level languages. Sure, Rust has a learning curve, and -thatlearning curve is a result of Rust's tendency to make complexity really _in +that learning curve is a result of Rust's tendency to make complexity really _in your face_. Make no mistake, every piece of software is complex: it has to run on @@ -74,8 +74,8 @@ In this article, I'd like to give three main pieces of advice: information. ## Ticket to heaven -We'll need a case to show how all this works, and since Mainmatter loves the -travel industry, let's write up an API for booking train tickets. +We'll need a case to show how all this works, and since Mainmatter [loves the +travel industry](/travel/), let's write up an API for booking train tickets. Looking at different train ticket services, in general, the steps towards booking are pretty similar: first, you enter the location you want to depart from and From 1e85d85994554e732f874c07ac2758ede92bebe6 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 11:04:43 +0100 Subject: [PATCH 06/13] Replace mermaid source with svg image --- src/posts/2024-12-02-trash-in-treasure-out.md | 17 +---------------- .../state-diagram.svg | 1 + 2 files changed, 2 insertions(+), 16 deletions(-) create mode 100644 static/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index 20e5149697..cd11b78e19 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -84,22 +84,7 @@ or when you want to arrive. Next, you select one of several suggested trips and enter your personal information. With all the information complete, you're all set to book the ticket and pay. Here's what that looks like as a flowchart: -```mermaid ---- -title: Ticket office ---- -flowchart TD - Origin(Select origin) --> - Destination(Select destination) --> - DepartureTimestamp(Enter departure timestamp) --> Trip - Destination --> ArrivalTimestamp(Enter arrival timestamp) --> Trip - Trip(Select trip) --> - Class(Select class) --> - Name(Enter name) --> - Email(Enter email) --> - PhoneNumber(Enter phone number) --> - Book(Book and pay) -``` +![State diagam](/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg) Pretty straightforward, right? Let's code one up. diff --git a/static/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg b/static/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg new file mode 100644 index 0000000000..33776bfd6e --- /dev/null +++ b/static/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg @@ -0,0 +1 @@ +

Select origin

Select destination

Enter departure timestamp

Select trip

Enter arrival timestamp

Select class

Enter name

Enter email

Enter phone number

Book and pay

\ No newline at end of file From ef557e83ab80c882910335715f1c600aefa5f440 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 11:13:31 +0100 Subject: [PATCH 07/13] Format markdown --- src/posts/2024-12-02-trash-in-treasure-out.md | 282 ++++-------------- 1 file changed, 60 insertions(+), 222 deletions(-) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index cd11b78e19..83002f0485 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -17,82 +17,35 @@ imageAlt: "" ## Intro -By now, you're probably aware that at Mainmatter, we like Rust a lot. If you -aren't: [have a look at our Rust page](https://mainmatter.com/rust-consulting/). -In this blog post, I'd like to highlight one of my favorite traits of Rust (yes -pun intended): its focus on _correctness_. Rust has a very expressive type -system that lets you offload many checks to the compiler: it supports generics, -data-carrying enums, closures, visibility specifiers, _explicit_ conversions, and -much more. These are neat features that make performant, low-level programming -feel as ergonomic as high-level languages. Sure, Rust has a learning curve, and -that learning curve is a result of Rust's tendency to make complexity really _in -your face_. - -Make no mistake, every piece of software is complex: it has to run on -computers, which, especially nowadays are complex beasts. And writing -software with highly optimized languages with manual memory management like -C, C++, or Rust requires knowledge of all kinds of subtleties. Rust makes these -subtleties _explicit_, forcing you to fix all kinds of things you may never -have thought of before even compiling your code. - -But that's not all: as projects grow and age and more people work on the same -piece of software, communication becomes very important. And by communication I -mean ensuring the original writer of some piece of code, the code reviewer, the -user of the code's API, the colleague refactoring the codebase, and new -developers are on the same page about the _intent_ and _invariants_ of that -code. What is this code doing? How am I supposed to use it correctly? What -happens if I mess up? How do I protect this API from input it might choke on? -Because 'Garbage in, garbage out' is not a great philosophy when setting up -critical and robust systems. Traditionally, one would write in documentation and -code comments the answers to these and many other questions. Writing -documentation is a very valuable job, but sadly, developers are human. And -humans make mistakes. And if the humans think they _themselves_ don't make -mistakes, they will surely agree that their colleagues _do_. - -Documentation written in human language needs to be clear, specific, and up-to- -date. And even if it's written well, for it to do its job, documentation needs -to be _read_ in the first place. And even if it _is_ read, it needs to be -interpreted and acted upon correctly. I don't know about you, but I'm way too -pedantic to see that go flawlessly. - -Now, this is why I like Rust's expressive type system: it lets me encode a great -deal of the semantics I'd otherwise have to describe in the documentation. You -can craft your APIs and types such that using your library or module becomes -very hard or even impossible. You can encode the _intent_ and _invariants_ -regarding your code using the type system. This way you get the Rust compiler -on _your_ side. It will be able to pick up subtle errors caused by your API -users holding it wrong. And it will do so _at compile time_, greatly shortening -the feedback loop. It makes adding features, refactoring, and reviewing much -less error-prone. And it's great for security as well. It's where coding meets -art, really. +By now, you're probably aware that at Mainmatter, we like Rust a lot. If you aren't: [have a look at our Rust page](https://mainmatter.com/rust-consulting/). In this blog post, I'd like to highlight one of my favorite traits of Rust (yes pun intended): its focus on _correctness_. Rust has a very expressive type system that lets you offload many checks to the compiler: it supports generics, data-carrying enums, closures, visibility specifiers, _explicit_ conversions, and much more. These are neat features that make performant, low-level programming feel as ergonomic as high-level languages. Sure, Rust has a learning curve, and that learning curve is a result of Rust's tendency to make complexity really _in your face_. + +Make no mistake, every piece of software is complex: it has to run on computers, which, especially nowadays are complex beasts. And writing software with highly optimized languages with manual memory management like C, C++, or Rust requires knowledge of all kinds of subtleties. Rust makes these subtleties _explicit_, forcing you to fix all kinds of things you may never have thought of before even compiling your code. + +But that's not all: as projects grow and age and more people work on the same piece of software, communication becomes very important. And by communication I mean ensuring the original writer of some piece of code, the code reviewer, the user of the code's API, the colleague refactoring the codebase, and new developers are on the same page about the _intent_ and _invariants_ of that code. What is this code doing? How am I supposed to use it correctly? What happens if I mess up? How do I protect this API from input it might choke on? Because 'Garbage in, garbage out' is not a great philosophy when setting up critical and robust systems. Traditionally, one would write in documentation and code comments the answers to these and many other questions. Writing documentation is a very valuable job, but sadly, developers are human. And humans make mistakes. And if the humans think they _themselves_ don't make mistakes, they will surely agree that their colleagues _do_. + +Documentation written in human language needs to be clear, specific, and up-to- date. And even if it's written well, for it to do its job, documentation needs to be _read_ in the first place. And even if it _is_ read, it needs to be interpreted and acted upon correctly. I don't know about you, but I'm way too pedantic to see that go flawlessly. + +Now, this is why I like Rust's expressive type system: it lets me encode a great deal of the semantics I'd otherwise have to describe in the documentation. You can craft your APIs and types such that using your library or module becomes very hard or even impossible. You can encode the _intent_ and _invariants_ regarding your code using the type system. This way you get the Rust compiler on _your_ side. It will be able to pick up subtle errors caused by your API users holding it wrong. And it will do so _at compile time_, greatly shortening the feedback loop. It makes adding features, refactoring, and reviewing much less error-prone. And it's great for security as well. It's where coding meets art, really. In this article, I'd like to give three main pieces of advice: -1. Encode the semantics/states of your application in the type system and your - API. + +1. Encode the semantics/states of your application in the type system and your API. 2. Ensure input gets parsed into rigid structs before acceptance. -3. Ensure output gets encoded in the correct format and doesn’t leak (sensitive) - information. +3. Ensure output gets encoded in the correct format and doesn’t leak (sensitive) information. ## Ticket to heaven -We'll need a case to show how all this works, and since Mainmatter [loves the -travel industry](/travel/), let's write up an API for booking train tickets. -Looking at different train ticket services, in general, the steps towards booking -are pretty similar: first, you enter the location you want to depart from and -where you want to go, then you enter either your preferred moment of departure -or when you want to arrive. Next, you select one of several suggested trips and -enter your personal information. With all the information complete, you're all -set to book the ticket and pay. Here's what that looks like as a flowchart: +We'll need a case to show how all this works, and since Mainmatter [loves the travel industry](/travel/), let's write up an API for booking train tickets. + +Looking at different train ticket services, in general, the steps towards booking are pretty similar: first, you enter the location you want to depart from and where you want to go, then you enter either your preferred moment of departure or when you want to arrive. Next, you select one of several suggested trips and enter your personal information. With all the information complete, you're all set to book the ticket and pay. Here's what that looks like as a flowchart: ![State diagam](/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg) Pretty straightforward, right? Let's code one up. ## Setting up -Let's set up a simple [`axum`]-based server to implement before flow. I'm only -going to post the code relevant to the story here, but if you're interested in -the whole shebang: check out the code for [step 0]. Here's what the app setup -looks like: + +Let's set up a simple [`axum`]-based server to implement before flow. I'm only going to post the code relevant to the story here, but if you're interested in the whole shebang: check out the code for [step 0]. Here's what the app setup looks like: ```rust // src/lib.rs @@ -130,8 +83,7 @@ pub async fn run() -> Result<()> { } ``` -As you can see, we've got routes for each step, as well as a basic in-memory -session store. For now, the handlers are pretty similar. Here's `set_origin`: +As you can see, we've got routes for each step, as well as a basic in-memory session store. For now, the handlers are pretty similar. Here's `set_origin`: ```rust // src/lib.rs @@ -144,14 +96,9 @@ async fn set_origin(session: Session, origin: String) -> Result for Location { pub struct ParseLocationError(String); ``` -Much better! Using the `#[serde(try_from = "String")]` attribute, we've -instructed `serde` to call the `Location::try_from` implementation upon -deserialization. Now, the _only_ way to instantiate a `Location` is through it's -`TryFrom` implementation, which does the validation. Barring any unsafe -magic tricks, that is. Getting the value _out_ is a matter of adding more -functionality, which I won't bore you with right now. But you can imagine adding -an implementation for `std::fmt::Display`, or a method -`fn as_str(&self) -> &str`. Don't go implement `std::ops::Deref` -though, that'd [defeat the purpose][deref_polymorphism]. +Much better! Using the `#[serde(try_from = "String")]` attribute, we've instructed `serde` to call the `Location::try_from` implementation upon deserialization. Now, the _only_ way to instantiate a `Location` is through it's `TryFrom` implementation, which does the validation. Barring any unsafe magic tricks, that is. Getting the value _out_ is a matter of adding more functionality, which I won't bore you with right now. But you can imagine adding an implementation for `std::fmt::Display`, or a method `fn as_str(&self) -> &str`. Don't go implement `std::ops::Deref` though, that'd [defeat the purpose][deref_polymorphism]. -With that set up, let's update our model, as well as the relevant method -handlers. Here's our freshly updated `TicketMachine`, which got moved to the -`crate::types::ticket_machine` module: +With that set up, let's update our model, as well as the relevant method handlers. Here's our freshly updated `TicketMachine`, which got moved to the `crate::types::ticket_machine` module: ```rust // src/types/ticket_machine.rs @@ -409,17 +323,9 @@ async fn set_origin(session: Session, Json(origin): Json) -> Result`. Axum will attempt to deserialize the request body into a -`Location`, and the `Json<_>` extractor tells it that it should use `serde_json` -to do so. And as `serde_json` is going to use the `serde::Deserialize` -implementation we derived on `Location` before, `Location::try_from` -gets run even the _before_ code within the route handler is run. So within the -route handler, we're _certain_ that the `origin` parameter represents a valid -`Location`! +As you can see, instead of taking a `String` body, this time we're taking a `Json`. Axum will attempt to deserialize the request body into a `Location`, and the `Json<_>` extractor tells it that it should use `serde_json` to do so. And as `serde_json` is going to use the `serde::Deserialize` implementation we derived on `Location` before, `Location::try_from` gets run even the _before_ code within the route handler is run. So within the route handler, we're _certain_ that the `origin` parameter represents a valid `Location`! -Now, of course, our test is just sending plain, unquoted strings, and unquoted -strings are not valid JSON. So let's update our test: +Now, of course, our test is just sending plain, unquoted strings, and unquoted strings are not valid JSON. So let's update our test: ```rust // tests/main.rs @@ -453,10 +359,7 @@ async fn test_set_bad_origin(origin: Cow<'static, [u8]>) { } ``` -We're now sending JSON! The signature changed a bit: instead of a -`&'static [u8]`, it now takes a `Cow<'static, [u8]>`, which helps with our JSON -serialization stuff, but let's not focus on that. Instead, I'm gonna distract -you with the test results: +We're now sending JSON! The signature changed a bit: instead of a `&'static [u8]`, it now takes a `Cow<'static, [u8]>`, which helps with our JSON serialization stuff, but let's not focus on that. Instead, I'm gonna distract you with the test results: ```bash $ cargo nextest run @@ -473,25 +376,17 @@ $ cargo nextest run Summary [ 0.047s] 5 tests run: 5 passed, 0 skipped ``` -There we go! With that set up, we have the following guarantees within the -`set_origin` method handler regarding the request body: +There we go! With that set up, we have the following guarantees within the `set_origin` method handler regarding the request body: - It's valid UTF-8; - It's valid JSON; -- It represents a valid `Location`, as defined in its `TryFrom` - implementation. +- It represents a valid `Location`, as defined in its `TryFrom` implementation. -And it's all checked by Rust's type system! We might as well throw out the cases -that pass in non-UTF-8 sequences or invalid JSON: the only really sensible -part to test is the implementation of `TryFrom`. But let's keep them -anyway because tests are great to have when doing big code refactors. +And it's all checked by Rust's type system! We might as well throw out the cases that pass in non-UTF-8 sequences or invalid JSON: the only really sensible part to test is the implementation of `TryFrom`. But let's keep them anyway because tests are great to have when doing big code refactors. ## Output sanitization -So far, Rust's type system has been working for us very well to give us -guarantees about input. How about output though? Using the [`newtype`] pattern -from the previous section again, we can ensure sensitive data gets hidden in -responses and logs. Furthermore, we can make the output encoding format part of -our type zoo. Let me remind you what our `TicketOffice` model looks like so far: + +So far, Rust's type system has been working for us very well to give us guarantees about input. How about output though? Using the [`newtype`] pattern from the previous section again, we can ensure sensitive data gets hidden in responses and logs. Furthermore, we can make the output encoding format part of our type zoo. Let me remind you what our `TicketOffice` model looks like so far: ```rust // src/types/ticket_machine.rs @@ -511,16 +406,7 @@ pub struct TicketMachine { } ``` -The first thing you'll notice is that we aren't doing any input validation -for the fields other than `origin` and `destination`. But other than that, our -struct holds some sensitive personal data: `name`, `email`, `phone_number`, and -`payment_info`. Let's focus on that last field, `payment_info`, though. We -haven't specified yet what `payment_info` _is_, but let's assume for now that it -may contain credit card details. Now, credit card details are things you don't -want ending up in your logs or API responses. Using the [`newtype`] pattern, we -can make it _hard_ to leak such data into the logs. The following examples can -be found in the repo state as of the [step 3] commit. Let's conjure up a -`PaymentInfo` type: +The first thing you'll notice is that we aren't doing any input validation for the fields other than `origin` and `destination`. But other than that, our struct holds some sensitive personal data: `name`, `email`, `phone_number`, and `payment_info`. Let's focus on that last field, `payment_info`, though. We haven't specified yet what `payment_info` _is_, but let's assume for now that it may contain credit card details. Now, credit card details are things you don't want ending up in your logs or API responses. Using the [`newtype`] pattern, we can make it _hard_ to leak such data into the logs. The following examples can be found in the repo state as of the [step 3] commit. Let's conjure up a `PaymentInfo` type: ```rust // src/types/payment_info.rs @@ -550,14 +436,7 @@ impl From for String { } ``` -This time, we've ensured the ways to convert `PaymentInfo` to a `String` are -watertight. Using the `#[serde(into = "String")]` attribute on the struct -definition, we've ensured that Serde uses the `Into` implementation on -`PaymentInfo` to serialize the struct, which gets forwarded to its `Display` -implementation. And that implementation hides our secrets. Nice! Accidentally -logging payment info is covered as well by the custom implementation of `Debug`. -Obviously, `PaymentInfo` requires input validation, too, but let's keep focus -on the output right now. +This time, we've ensured the ways to convert `PaymentInfo` to a `String` are watertight. Using the `#[serde(into = "String")]` attribute on the struct definition, we've ensured that Serde uses the `Into` implementation on `PaymentInfo` to serialize the struct, which gets forwarded to its `Display` implementation. And that implementation hides our secrets. Nice! Accidentally logging payment info is covered as well by the custom implementation of `Debug`. Obviously, `PaymentInfo` requires input validation, too, but let's keep focus on the output right now. Let's update our `TicketMachine` and the `book_trip` route handler: @@ -586,9 +465,7 @@ async fn book_trip( } ``` -Great. We were already wrapping our output in a `Json`, ensuring the data gets -encoded in the right format before sending it out. Now we'll add some tests to -validate that this works: +Great. We were already wrapping our output in a `Json`, ensuring the data gets encoded in the right format before sending it out. Now we'll add some tests to validate that this works: ```rust // tests/main.rs @@ -668,74 +545,35 @@ $ cargo nextest run Summary [ 0.052s] 7 tests run: 7 passed, 0 skipped ``` -There you go! With that, we've ensured that once our `PaymentInfo` is -instantiated, it'll be quite hard to accidentally leak its contents. Completely -hiding the payment info from everything would make it rather unuseful, but at -least we can't accidentally log them or send them in a response, preventing a -very likely cause of leaking information. +There you go! With that, we've ensured that once our `PaymentInfo` is instantiated, it'll be quite hard to accidentally leak its contents. Completely hiding the payment info from everything would make it rather unuseful, but at least we can't accidentally log them or send them in a response, preventing a very likely cause of leaking information. ## Wrapping up -We've reached a lot already! We've created meaningful types for handling the -data in our model, ensured they're valid by construction, and that they don't -leak sensitive information. With that, our API has become much more robust than -the version we started out with. Let's summarize what we've achieved with that. + +We've reached a lot already! We've created meaningful types for handling the data in our model, ensured they're valid by construction, and that they don't leak sensitive information. With that, our API has become much more robust than the version we started out with. Let's summarize what we've achieved with that. In the [introduction](#trash-in-treasure-out), I listed three pieces of advice: -> 1. Encode the semantics/states of your application in the type system and your - API. +> 1. Encode the semantics/states of your application in the type system and your API. > 2. Ensure input gets parsed into rigid structs before acceptance. -> 3. Ensure output gets encoded in the correct format and doesn’t leak - (sensitive) information. - -In [step 2](#even-better-validation), we've covered the first two points. -We started out creating an explicit `Location` type, with a name that clearly -indicates what it conveys. We've skipped adding documentation on that type, -but if we hadn't, it could describe the semantics and invariants of `Location` -some more. That documentation would be easily findable anywhere `Location` is -used. - -Furthermore, we ensured `Location`s are valid by construction: by implementing -the validation in the `TryFrom` implementation for `Location`, and -ensuring the `Location` can only be created and deserialized via that -validation, we've ensured that a `Location` _always_ represents a valid -location, *as long as our validation logic is correct*. And by accepting -`Json` in our Axum request handlers directly, those handlers don't -need to do any further validation. - -In [step 3](#output-sanitization), we've ensured the `PaymentDetails` can't leak -sensitive information in logs or responses by implementing `Debug` and `Display` -such that they don't actually use the wrapped `String`, and ensured the -`From` implementation for `String` uses our `Display` -implementation. We can add dedicated methods to get the data out in case we -need to store the payment details in our database, for instance. With that, -_accidentally_ leaking such info has become much harder. - -Are there any downsides? As always: yes, this is no silver bullet. One thing you -probably have noticed so far is that the patterns described in this post -introduce a bunch of boilerplate. There are crates (e.g. [`nutype`]) out there -that aim to reduce this, but they come with their own trade-offs. Furthermore, -sometimes not all invariants can be expressed in Rust code. In such cases, one -still has to rely on documentation to be thorough and correct. - -Other than that, rigidity may not always be what you want. Sometimes your -invariants and requirements are not all that clear, and are very subject to -change. In such cases, it's not great to update loads of boilerplate all the -time. This, I think, is a bit of a matter of taste: I myself like to force -myself to clarify the requirements and invariants before implementation, and -with the validation being implemented in a single place, updating that is not -such a big hassle. And what you get back is huge: correct, robust, clear, and -maintainable code! - -*In [step 4], I've updated the rest of the method handlers, and demonstrate the -[`validator`] and [`nutype`] crates briefly. Be sure to have a look!* +> 3. Ensure output gets encoded in the correct format and doesn’t leak (sensitive) information. + +In [step 2](#even-better-validation), we've covered the first two points. We started out creating an explicit `Location` type, with a name that clearly indicates what it conveys. We've skipped adding documentation on that type, but if we hadn't, it could describe the semantics and invariants of `Location` some more. That documentation would be easily findable anywhere `Location` is used. + +Furthermore, we ensured `Location`s are valid by construction: by implementing the validation in the `TryFrom` implementation for `Location`, and ensuring the `Location` can only be created and deserialized via that validation, we've ensured that a `Location` _always_ represents a valid location, _as long as our validation logic is correct_. And by accepting `Json` in our Axum request handlers directly, those handlers don't need to do any further validation. + +In [step 3](#output-sanitization), we've ensured the `PaymentDetails` can't leak sensitive information in logs or responses by implementing `Debug` and `Display` such that they don't actually use the wrapped `String`, and ensured the `From` implementation for `String` uses our `Display` implementation. We can add dedicated methods to get the data out in case we need to store the payment details in our database, for instance. With that, _accidentally_ leaking such info has become much harder. + +Are there any downsides? As always: yes, this is no silver bullet. One thing you probably have noticed so far is that the patterns described in this post introduce a bunch of boilerplate. There are crates (e.g. [`nutype`]) out there that aim to reduce this, but they come with their own trade-offs. Furthermore, sometimes not all invariants can be expressed in Rust code. In such cases, one still has to rely on documentation to be thorough and correct. + +Other than that, rigidity may not always be what you want. Sometimes your invariants and requirements are not all that clear, and are very subject to change. In such cases, it's not great to update loads of boilerplate all the time. This, I think, is a bit of a matter of taste: I myself like to force myself to clarify the requirements and invariants before implementation, and with the validation being implemented in a single place, updating that is not such a big hassle. And what you get back is huge: correct, robust, clear, and maintainable code! + +_In [step 4], I've updated the rest of the method handlers, and demonstrate the [`validator`] and [`nutype`] crates briefly. Be sure to have a look!_ [step 0]: https://github.com/mainmatter/trash-in-treasure-out/commit/abaa132a4250c71846ddf9a4540129af9952c9e8 [step 1]: https://github.com/mainmatter/trash-in-treasure-out/commit/5c03b284bc0b1c932ec1c09b6abfef13f5cdfa4e [step 2]: https://github.com/mainmatter/trash-in-treasure-out/commit/305b8088b5155aeb13a473ca398fd1d522405b7d [step 3]: https://github.com/mainmatter/trash-in-treasure-out/commit/1dc8400afff4a31bcc1586e577a4af39124b8dfa [step 4]: https://github.com/mainmatter/trash-in-treasure-out/commit/305b8088b5155aeb13a473ca398fd1d522405b7d - [`axum`]: https://crates.io/crates/axum/ [`reqwest`]: https://crates.io/crates/reqwest/ [`cargo-nextest`]: https://nexte.st/ @@ -743,4 +581,4 @@ maintainable code! [newtype]: https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html?highlight=newtype#newtype [deref_polymorphism]: https://rust-unofficial.github.io/patterns/anti_patterns/deref.html [`nutype`]: https://crates.io/crates/nutype/ -[`validator`]: https://crates.io/crates/validator/ \ No newline at end of file +[`validator`]: https://crates.io/crates/validator/ From 1c82f47536a92a3ad4a315c22e296aec02876f07 Mon Sep 17 00:00:00 2001 From: Marco Otte-Witte Date: Fri, 6 Dec 2024 11:23:07 +0100 Subject: [PATCH 08/13] remove non-existent image --- src/posts/2024-12-02-trash-in-treasure-out.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index 83002f0485..6e83ed8ab2 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -10,9 +10,6 @@ tagline: |

Making your API clear and robust with Rust's type system.

- -image: "" -imageAlt: "" --- ## Intro From 7af05bd17b51521c6d83113da7d70ec8dbe38a77 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 11:33:37 +0100 Subject: [PATCH 09/13] Add profile pic --- static/assets/images/authors/hdoordt.jpg | Bin 0 -> 122274 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/assets/images/authors/hdoordt.jpg diff --git a/static/assets/images/authors/hdoordt.jpg b/static/assets/images/authors/hdoordt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a052659eed94ba9aa97b1b4f514ef03ac444914e GIT binary patch literal 122274 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%0Dw61!YLEHt)22t=Lxm-x7gYmnSLUI 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 BK Date: Fri, 6 Dec 2024 11:44:24 +0100 Subject: [PATCH 10/13] Update tagline --- src/posts/2024-12-02-trash-in-treasure-out.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index 6e83ed8ab2..62833146fe 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -8,7 +8,7 @@ og: image: "/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png" tagline: |

- Making your API clear and robust with Rust's type system. + Using Rust, you can encode a large part of the constraints and semantics of your API using the type system. In this article, we'll discuss how to do it, and how you can use it to your benefit.

--- From f7c5e13881b1fdb9e36f46e649d9f140bb219a59 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 11:50:41 +0100 Subject: [PATCH 11/13] add athors/hdoordt.md --- src/authors/hdoordt.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/authors/hdoordt.md diff --git a/src/authors/hdoordt.md b/src/authors/hdoordt.md new file mode 100644 index 0000000000..8f44abb377 --- /dev/null +++ b/src/authors/hdoordt.md @@ -0,0 +1,6 @@ +--- +name: "Henk Oordt" +github: hdoordt +linkedin: hdoordt +bio: "Senior Software Engineering Consultant" +--- From e4d9214cfc1a40b0381932e83c6e9ac6f2633537 Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 11:59:47 +0100 Subject: [PATCH 12/13] Center state diagram image --- src/posts/2024-12-02-trash-in-treasure-out.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index 62833146fe..d2fe369a35 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -36,8 +36,12 @@ We'll need a case to show how all this works, and since Mainmatter [loves the tr Looking at different train ticket services, in general, the steps towards booking are pretty similar: first, you enter the location you want to depart from and where you want to go, then you enter either your preferred moment of departure or when you want to arrive. Next, you select one of several suggested trips and enter your personal information. With all the information complete, you're all set to book the ticket and pay. Here's what that looks like as a flowchart: +
+ ![State diagam](/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg) +
+ Pretty straightforward, right? Let's code one up. ## Setting up From 510691ad628a2b1fa3011a1a0b47615bed827d4e Mon Sep 17 00:00:00 2001 From: Henk Oordt Date: Fri, 6 Dec 2024 12:03:27 +0100 Subject: [PATCH 13/13] Refer to tree instead of diff in step links --- src/posts/2024-12-02-trash-in-treasure-out.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md index d2fe369a35..8082241526 100644 --- a/src/posts/2024-12-02-trash-in-treasure-out.md +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -570,11 +570,11 @@ Other than that, rigidity may not always be what you want. Sometimes your invari _In [step 4], I've updated the rest of the method handlers, and demonstrate the [`validator`] and [`nutype`] crates briefly. Be sure to have a look!_ -[step 0]: https://github.com/mainmatter/trash-in-treasure-out/commit/abaa132a4250c71846ddf9a4540129af9952c9e8 -[step 1]: https://github.com/mainmatter/trash-in-treasure-out/commit/5c03b284bc0b1c932ec1c09b6abfef13f5cdfa4e -[step 2]: https://github.com/mainmatter/trash-in-treasure-out/commit/305b8088b5155aeb13a473ca398fd1d522405b7d -[step 3]: https://github.com/mainmatter/trash-in-treasure-out/commit/1dc8400afff4a31bcc1586e577a4af39124b8dfa -[step 4]: https://github.com/mainmatter/trash-in-treasure-out/commit/305b8088b5155aeb13a473ca398fd1d522405b7d +[step 0]: https://github.com/mainmatter/trash-in-treasure-out/tree/abaa132a4250c71846ddf9a4540129af9952c9e8 +[step 1]: https://github.com/mainmatter/trash-in-treasure-out/tree/5c03b284bc0b1c932ec1c09b6abfef13f5cdfa4e +[step 2]: https://github.com/mainmatter/trash-in-treasure-out/tree/305b8088b5155aeb13a473ca398fd1d522405b7d +[step 3]: https://github.com/mainmatter/trash-in-treasure-out/tree/1dc8400afff4a31bcc1586e577a4af39124b8dfa +[step 4]: https://github.com/mainmatter/trash-in-treasure-out/tree/305b8088b5155aeb13a473ca398fd1d522405b7d [`axum`]: https://crates.io/crates/axum/ [`reqwest`]: https://crates.io/crates/reqwest/ [`cargo-nextest`]: https://nexte.st/