2020-07-29
2067
#rust
Thomas Eizinger
22465
Jul 29, 2020 ⋅ 7 min read

How to use the Rust compiler as your integration testing framework

Thomas Eizinger I like to think about systems as a whole instead of just dealing with the frontend or backend. Quality matters a lot to me, concerning both the end product and the engineering process that leads to it.

Recent posts:

ai dev tool power rankings

AI dev tool power rankings & comparison [March 2026]

Compare the top AI development tools and models of March 2026. View updated rankings, feature breakdowns, and find the best fit for you.

Chizaram Ken
Mar 12, 2026 ⋅ 10 min read
the replay march 11

The Replay (3/11/26): Eng knowledge gaps, OpenClaw, and more

Discover what’s new in The Replay, LogRocket’s newsletter for dev and engineering leaders, in the March 11th issue.

Matt MacCormack
Mar 11, 2026 ⋅ 26 sec read
ai training alexandra spalato

Your engineering team’s AI training is probably failing: How to fix it

Buying AI tools isn’t enough. Engineering teams need AI literacy programs to unlock real productivity gains and avoid uneven adoption.

Alexandra Spalato
Mar 11, 2026 ⋅ 4 min read
5 Reasons your AI app fails in production (And how to fix it)

5 reasons your AI app fails in production (and how to fix it)

If your AI app or agent works perfectly in development but falls apart in production, you’re not alone. In a […]

Elijah Asaolu
Mar 10, 2026 ⋅ 8 min read
View all posts

2 Replies to "How to use the Rust compiler as your integration testing framework"

  1. Hi Thomas, thanks for your article! You write about Percent class, “Because the field within Percent is private, the only to construct an instance of Percent is through the new function.”

    Here is a counterexample:

    #[derive(Debug)]
    struct Percent(f64);

    impl Percent {
    fn new(value: f64) -> anyhow::Result {
    println!(“Creating a Percent object.”);
    if value > 1. {
    anyhow::bail!(“number is too big!”)
    }

    if value < 0. {
    anyhow::bail!("number is too small!")
    }

    Ok(Self(value))
    }
    }

    fn main() {
    let a = Percent::new(0.5);
    let b = Percent(1.6); // this doesn't break, but should!

    println!("Hello, {:?}!", a);
    println!("Hello, {:?}!", b);
    }

  2. Hi Ilya,

    thanks for the comment!
    You are correct that one can still construct an instance of `Percent` if you are within the same module and hence have access to private fields. There is nothing we can do about this but there is also little need to. Generally, it is important that the public API of a module maintains all of the invariants.

    In your case, I would simply put `Percent` into its own module which means all of the “usage” code has to go through the public API and can no longer access the private field. See this playground here: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0ad00716fe95313d36902679aff41f9e

    Cheers,
    Tom

Leave a Reply

Your email address will not be published. Required fields are marked *

Hey there, want to help make our blog better?

Join LogRocket’s Content Advisory Board. You’ll help inform the type of content we create and get access to exclusive meetups, social accreditation, and swag.

Sign up now