Thomas Eizinger
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:

How To Integrate WunderGraph With Your Frontend Application

How to integrate WunderGraph with your frontend application

Unify and simplify APIs using WunderGraph to integrate REST, GraphQL, and databases in a single endpoint.

Boemo Mmopelwa
May 17, 2024 ⋅ 5 min read
Understanding The Latest Webkit Features In Safari 17.4

Understanding the latest Webkit features in Safari 17.4

The Safari 17.4 update brought in many modern features and bug fixes. Explore the major development-specific updates you should be aware of.

Rahul Chhodde
May 16, 2024 ⋅ 10 min read
Using Webrtc To Implement Peer To Peer Video Streaming In A Node Js Project

Using WebRTC to implement P2P video streaming

Explore one of WebRTC’s major use cases in this step-by-step tutorial: live peer-to-peer audio and video streaming between systems.

Oduah Chigozie
May 16, 2024 ⋅ 18 min read
Htmx Vs React

htmx vs. React: Choosing the right library for your project

Both htmx and React provide powerful tools for building web apps, but in different ways that are suited to different types of projects.

Temitope Oyedele
May 15, 2024 ⋅ 9 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:

    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!")


    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


Leave a Reply