Peppermint
  • March 7, 2024
  1. Introduction
  2. Requirements
  3. Installation
  4. Usage Examples
  5. Contribute
  6. Meta

Introduction


 

let constraint = TypeConstraint<Account, Account.Error> {
KeyPathConstraint(\.username) {
BlockConstraint {
$0.count >= 5
} errorBuilder: {
.username
}
}
KeyPathConstraint(\.password) {
GroupConstraint(.all) {
PredicateConstraint {
.characterSet(.lowercaseLetters, mode: .inclusive)
} errorBuilder: {
.password(.missingLowercase)
}
PredicateConstraint{
.characterSet(.uppercaseLetters, mode: .inclusive)
} errorBuilder: {
.password(.missingUppercase)
}
PredicateConstraint {
.characterSet(.decimalDigits, mode: .inclusive)
} errorBuilder: {
.password(.missingDigits)
}
PredicateConstraint {
.characterSet(CharacterSet(charactersIn: “!?@#$%^&*()|\\/<>,.~`_+-=”), mode: .inclusive)
} errorBuilder: {
.password(.missingSpecialChars)
}
PredicateConstraint {
.length(min: 8)
} errorBuilder: {
.password(.tooShort)
}
}
}
BlockConstraint {
$0.password == $0.passwordConfirmation
} errorBuilder: {
.password(.confirmationMismatch)
}
KeyPathConstraint(\.email) {
PredicateConstraint(.email, error: .email)
}
KeyPathConstraint(\.age) {
PredicateConstraint(.range(min: 14), error: .underAge)
}
KeyPathConstraint(\.website) {
PredicateConstraint(.url, error: .website)
.optional()
}
}

let result = constraint.evaluate(with: account)
switch result {
case .success:
handleSuccess()
case .failure(let summary):
handleErrors(summary.errors)
}

Peppermint is a declarative and lightweight data validation framework.

At the core of it, there are 2 principles:

  • Empower composition.
  • Embrace standard library.

Every project is unique in it’s own challenges and it’s great when we can focus on solving them instead of spending our time on boilerplate tasks.

With this idea in mind, the framework follows the Protocol Oriented Programming paradigm and was designed from a small set of protocols and structures that can easily be composed to fit your project needs. Thus, you can think of Peppermint as an adjustable wrench more than a Swiss knife.

Since validation can take place at many levels, Peppermint is available on iOS, macOS, tvOS, watchOS and native Swift projects, such as server-side apps.

Requirements


  • Swift 4.2+
  • iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
  • Xcode 8.1+

Installation


Peppermint is available only through Swift Package Manager.

Swift Package Manager

You can add Peppermint to your project in Xcode by going to File > Swift Packages > Add Package Dependency.

Or, if you want to use it as a dependency to your own package, you can add it to your Package.swift file:

import PackageDescription

let package = Package(
name: “YOUR_PROJECT_NAME”,
targets: [],
dependencies: [
.Package(url: “https://github.com/nsagora/peppermint”, majorVersion: 1),
]
)

Usage example


For a comprehensive list of examples try out the Examples.playground:

  1. Download the repository locally on your machine
  2. Open the project in Xcode
  3. Select the Examples playground from the Project navigator

The Peppermint framework is compact and offers you the foundation you need to build data validation around your project needs. In addition, it includes a set of common validation predicates and constraints that most projects can benefit off.

Predicates

The Predicate represents the core protocol and has the role to evaluate if an input matches on a given validation condition.

At the core of Peppermint there are the following two predicates, which allows you to compose predicates specific to the project needs:

BlockPredicate
RegexPredicate

In addition, the framework offers a set of common validation predicates that your project can benefit of:

EmailPredicate
URLPredicate
RangePredicate
LengthPredicate

On top of that, developers can build more advanced or complex predicates by extending the Predicate protocol, and/ or by composing or decorating the existing predicates:

Custom Predicate

Constraints

Predicate Constraint

PredicateConstraint represents a data type that links a Predicate to an Error, in order to provide useful feedback for the end users.

PredicateConstraint

Block Constraint

BlockConstraint represents a data type that links a custom validation closure to an Error that describes why the evaluation has failed. It’s a shortcut of a PredicateConstraint that is initialised with a BlockPredicate.

BlockConstraint

Group Constraint

GroupConstraint represents a composition of constraints that allows the evaluation to be made on:

  • all constraints
  • or any of the constraints

To provide context, a GroupConstraint allows us to constraint a piece of data as being required and also as being a valid email.

GroupConstraint

 

GitHub


View Github

#ios #macos #swift #validation #validation-engine #validation-kit
YOU MIGHT ALSO LIKE...
CameraBackground

Features Both front and back camera supported. Flash modes: auto, on, off. Countdown timer. Tap to focus. Pinch to zoom. Usage  

DKCamera

Description A light weight & simple & easy camera for iOS by Swift. It uses CoreMotion framework to detect device orientation, so ...

HorizonSDK-iOS

Horizon SDK is a state of the art real-time video recording / photo shooting iOS library. Some of the features ...

LLSimpleCamera

LLSimpleCamera: A simple customizable camera - video recorder control LLSimpleCamera is a library for creating a customized camera - video ...

RSBarcodes_Swift

RSBarcodes allows you to read 1D and 2D barcodes using the metadata scanning capabilities introduced with iOS 7 and generate ...