A result struct returns both a success flag and a reason code.

result Return a small result object when the caller needs more than true or false.
reason Reason codes let the caller distinguish invalid input from input that is merely incomplete.

Validation Result

age
validation_result.cpp
Replay: real traced execution (multi-file project)
#include <iostream>

struct Validation {
    bool ok;
    int code;
};

Validation validateAge(int age) {
    if (age < 0) {
        return {false, 1};
    }
    if (age < 18) {
        return {false, 2};
    }
    return {true, 0};
}

int main() {
    int age = 17;

    Validation result = validateAge(age);

    std::cout << "age=" << age << std::endl;
    std::cout << "ok=" << result.ok << std::endl;
    std::cout << "code=" << result.code << std::endl;
    return 0;
}
#include <iostream>

struct Validation {
    bool ok;
    int code;
};

Validation validateAge(int age) {
    if (age < 0) {
        return {false, 1};
    }
    if (age < 18) {
        return {false, 2};
    }
    return {true, 0};
}

int main() {
    int age = -3;

    Validation result = validateAge(age);

    std::cout << "age=" << age << std::endl;
    std::cout << "ok=" << result.ok << std::endl;
    std::cout << "code=" << result.code << std::endl;
    return 0;
}
#include <iostream>

struct Validation {
    bool ok;
    int code;
};

Validation validateAge(int age) {
    if (age < 0) {
        return {false, 1};
    }
    if (age < 18) {
        return {false, 2};
    }
    return {true, 0};
}

int main() {
    int age = 21;

    Validation result = validateAge(age);

    std::cout << "age=" << age << std::endl;
    std::cout << "ok=" << result.ok << std::endl;
    std::cout << "code=" << result.code << std::endl;
    return 0;
}
  1. age ← 17

    18int main() {19    int age→ 17 = 17; //@age=21, -32021    Validation result = validateAge(age17);
  2. Validation validateAge(int age)

    8Validation validateAge(int age17) {9    if (age < 0) {
  3. if (age < 18)

    11}12if (age17 < 18) {13    return {false, 2};14}
  4. result ← (empty)

    21    Validation result→ (empty) = validateAge(age17);2223    std::cout << "age=" << age17 << std::endl;24    std::cout << "ok=" << result(empty).ok << std::endl;25    std::cout << "code=" << result(empty).code << std::endl;26    return 0;27}
    outputage=17
    ok=0
    code=2
  1. age ← -3

    18int main() {19    int age→ -3 = -3;2021    Validation result = validateAge(age-3);
  2. Validation validateAge(int age)

    8Validation validateAge(int age-3) {9    if (age < 0) {
  3. if (age < 0)

    8Validation validateAge(int age) {9    if (age-3 < 0) {10        return {false, 1};11    }
  4. result ← (empty)

    21    Validation result→ (empty) = validateAge(age-3);2223    std::cout << "age=" << age-3 << std::endl;24    std::cout << "ok=" << result(empty).ok << std::endl;25    std::cout << "code=" << result(empty).code << std::endl;26    return 0;27}
    outputage=-3
    ok=0
    code=1
  1. age ← 21

    18int main() {19    int age→ 21 = 21;2021    Validation result = validateAge(age21);
  2. Validation validateAge(int age)

    8Validation validateAge(int age21) {9    if (age < 0) {10        return {false, 1};11    }12    if (age < 18) {13        return {false, 2};14    }15    return {true, 0};16}
  3. result ← (empty)

    21    Validation result→ (empty) = validateAge(age21);2223    std::cout << "age=" << age21 << std::endl;24    std::cout << "ok=" << result(empty).ok << std::endl;25    std::cout << "code=" << result(empty).code << std::endl;26    return 0;27}
    outputage=21
    ok=1
    code=0