# wibosco/validation-example architecture

> Architecture diagram of the GitHub repository wibosco/validation-example, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/wibosco/validation-example
- Repository: https://github.com/wibosco/validation-example

## Overview

Validation-Example is a SwiftUI demonstration of composable form validation. The user edits registration fields; each field’s view model debounces changes, invokes its validator, and exposes validation state for inline feedback. The registration model combines the email and password states to determine whether submission is allowed; submission itself is omitted in the sample. The app entry point wires the validators, view models, and screen together. Some password and supporting implementation files are represented from the tree, but their source was not sampled.

Main entry points: [`Validation-Example/Application/Validation_ExampleApp.swift`](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Application/Validation_ExampleApp.swift) (App composition), [`Validation-Example/Features/Registration/Validation/ValidationViewModel.swift`](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/ValidationViewModel.swift) (Validation model), [`Validation-Example/Features/Registration/RegistrationView.swift`](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/RegistrationView.swift) (Registration screen), [`Validation-Example/Features/Registration/RegistrationViewModel.swift`](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/RegistrationViewModel.swift) (Registration model)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Registration UI"]
  node_app["App composition"]
  node_screen["Registration screen"]
  node_field["Input field"]
  node_registration["Registration model"]
end

subgraph group_validation["Validation Core"]
  node_validation_vm["Validation model"]
  node_type_erasure["Type erasure"]
  node_state["Validation state"]
  node_debouncer["Debouncer<br/>[Debouncer.swift]"]
end

subgraph group_rules["Validation Rules"]
  node_validator["Validator contract<br/>[Validator.swift]"]
  node_email_validator["Email rules"]
  node_email_error["Email errors"]
  node_password_validator["Password rules"]
  node_password_error["Password errors"]
end

node_user(("User"))

node_user -->|"edits fields"| node_screen
node_app -->|"creates"| node_email_validator
node_app -->|"creates"| node_password_validator
node_app -->|"creates"| node_validation_vm
node_app -->|"erases types"| node_type_erasure
node_app -->|"creates"| node_registration
node_app -->|"presents"| node_screen
node_screen -->|"binds fields"| node_registration
node_screen -->|"renders"| node_field
node_registration -->|"reads validity"| node_state
node_registration -->|"holds view models"| node_type_erasure
node_validation_vm -->|"submits action"| node_debouncer
node_debouncer -->|"runs action"| node_validation_vm
node_validation_vm -->|"validates value"| node_validator
node_email_validator -->|"throws"| node_email_error
node_password_validator -->|"throws"| node_password_error
node_validation_vm -->|"updates state"| node_state
node_field -->|"displays feedback"| node_state

click node_app "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Application/Validation_ExampleApp.swift"
click node_screen "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/RegistrationView.swift"
click node_field "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/ValidationInputField.swift"
click node_registration "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/RegistrationViewModel.swift"
click node_validation_vm "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/ValidationViewModel.swift"
click node_type_erasure "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/AnyValidationViewModel.swift"
click node_state "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/ValidationState.swift"
click node_debouncer "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Debouncing/Debouncer.swift"
click node_validator "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Validator.swift"
click node_email_validator "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/EmailAddressValidator.swift"
click node_email_error "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/EmailAddressValidationError.swift"
click node_password_validator "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/PasswordValidator.swift"
click node_password_error "https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/PasswordValidationError.swift"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_screen,node_field,node_registration,node_user toneBlue
class node_validation_vm,node_type_erasure,node_state,node_debouncer toneAmber
class node_validator,node_email_validator,node_email_error,node_password_validator,node_password_error toneMint
```

## Components

### Registration UI

- [App composition](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Application/Validation_ExampleApp.swift): `Validation-Example/Application/Validation_ExampleApp.swift`
- [Registration screen](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/RegistrationView.swift): `Validation-Example/Features/Registration/RegistrationView.swift`
- [Input field](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/ValidationInputField.swift): `Validation-Example/Features/Registration/Validation/ValidationInputField.swift`
- [Registration model](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/RegistrationViewModel.swift): `Validation-Example/Features/Registration/RegistrationViewModel.swift`

### Validation Core

- [Validation model](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/ValidationViewModel.swift): `Validation-Example/Features/Registration/Validation/ValidationViewModel.swift`
- [Type erasure](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/AnyValidationViewModel.swift): `Validation-Example/Features/Registration/Validation/AnyValidationViewModel.swift`
- [Validation state](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/ValidationState.swift): `Validation-Example/Features/Registration/Validation/ValidationState.swift`
- [Debouncer](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Debouncing/Debouncer.swift): `Validation-Example/Features/Registration/Debouncing/Debouncer.swift`

### Validation Rules

- [Validator contract](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Validator.swift): `Validation-Example/Features/Registration/Validation/Validators/Validator.swift`
- [Email rules](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/EmailAddressValidator.swift): `Validation-Example/Features/Registration/Validation/Validators/Custom/EmailAddressValidator.swift`
- [Email errors](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/EmailAddressValidationError.swift): `Validation-Example/Features/Registration/Validation/Validators/Custom/EmailAddressValidationError.swift`
- [Password rules](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/PasswordValidator.swift): `Validation-Example/Features/Registration/Validation/Validators/Custom/PasswordValidator.swift`
- [Password errors](https://github.com/wibosco/validation-example/blob/main/Validation-Example/Features/Registration/Validation/Validators/Custom/PasswordValidationError.swift): `Validation-Example/Features/Registration/Validation/Validators/Custom/PasswordValidationError.swift`

### Other components

- **User**

## Connections

- User → Registration screen: edits fields
- App composition → Email rules: creates
- App composition → Password rules: creates
- App composition → Validation model: creates
- App composition → Type erasure: erases types
- App composition → Registration model: creates
- App composition → Registration screen: presents
- Registration screen → Registration model: binds fields
- Registration screen → Input field: renders
- Registration model → Validation state: reads validity
- Registration model → Type erasure: holds view models
- Validation model → Debouncer: submits action
- Debouncer → Validation model: runs action
- Validation model → Validator contract: validates value
- Email rules → Email errors: throws
- Password rules → Password errors: throws
- Validation model → Validation state: updates state
- Input field → Validation state: displays feedback
