GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feather-examples/validation at main · feather-framework/feather-examples

Expand file tree

/

validation

/
Copy path

Directory actions

More options

More options

Directory actions

More options

More options

Latest commit

 

History

History
History
/

validation

/
Copy path

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Sources/ValidationExamples
Sources/ValidationExamples
 
 
Tests/ValidationExamplesTests
Tests/ValidationExamplesTests
 
 
Package.resolved
Package.resolved
 
 
Package.swift
Package.swift
 
 
README.md
README.md
 
 

README.md

Outline

Validation examples

This package contains a Hummingbird user CRUD example validated with feather-validation (main).

Routes:

  • GET /users
  • GET /users/active
  • GET /users/count
  • POST /users
  • GET /users/:id
  • PUT /users/:id
  • PATCH /users/:id
  • DELETE /users/:id
  • POST /users/:id/activate
  • POST /users/:id/deactivate

Request payload fields (POST /users, PUT /users/:id, PATCH /users/:id):

  • name
  • email
  • age
  • role
  • inviteCode
  • username
  • trustScore
  • loginCount
  • isActive

Validation rules:

  • name: trimmed non-empty, min/max count, forbidden values (admin, root)
  • email: trimmed non-empty, valid email
  • age: between(18...120)
  • role: allow-list (member, editor)
  • inviteCode: exact count 8
  • username: starts with user-, ends with -id, exact length 11
  • trustScore: > 0 and <= 100
  • loginCount: non-negative and in range 0...1000
  • create/update require all fields above (except isActive defaults to true)
  • patch validates only provided fields

Rule families exercised through API tests:

  • Rule+Collection (count(min:), count(max:), count(_:))
  • Rule+Comparable (between, greaterThan, lessThanOrEqual)
  • Rule+Contains (contains, notContains)
  • Rule+String (trimmedNonempty, starts, ends, length)
  • Rule+Int (range, nonNegative)

Extending validations:

  • validations are defined in Sources/ValidationExamples/Validation/UserRequestValidation+Failures.swift and Sources/ValidationExamples/Validation/UserRequestValidation+Rules.swift
  • controller uses request validation extensions directly
  • add rules by passing custom rule arrays into payload.failures(rules:):
let extraCreateRule: UserCreateValidation = { payload in
    Validator(key: "name", value: payload.name, rules: [.starts(with: "A")])
}

let failures = await payload.failures(
    rules: UserCreateRequest.rules + [extraCreateRule]
)

Model layout:

  • Sources/ValidationExamples/Models/User.swift
  • Sources/ValidationExamples/Models/UserRequests.swift
  • Sources/ValidationExamples/Models/UserResponses.swift

Examples:

# Create valid user
curl -i -X POST http://127.0.0.1:8080/users \
  -H 'content-type: application/json' \
  -d '{"name":"Alex","email":"[email protected]","age":32,"role":"member","inviteCode":"AB12CD34","username":"user-alx-id","trustScore":50,"loginCount":0,"isActive":true}'

# Create invalid user (returns 422 + validation errors)
curl -i -X POST http://127.0.0.1:8080/users \
  -H 'content-type: application/json' \
  -d '{"name":"","email":"invalid","age":200,"role":"owner","inviteCode":"BAD","username":"acct-alx","trustScore":0,"loginCount":-1}'

# Create with malformed JSON (returns 400)
curl -i -X POST http://127.0.0.1:8080/users \
  -H 'content-type: application/json' \
  -d '{"name":"Alex",'

Usage

Run tests:

cd validation
swift test
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.