-
Notifications
You must be signed in to change notification settings - Fork 2
/
input-validation.ts
60 lines (42 loc) · 1.86 KB
/
input-validation.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// ! NOTE: You need to clone this repository locally and open it in your IDE (VS Code) to see typesafety in action.
import { exception, success } from 'exceptionally'
// --------------------------------------------------------------------------------------------------------------------
const validate = <Data>(data: Data, validator: (data: Data) => true | string) => {
const isOk = validator(data)
if (isOk === true) return success(data)
return exception(isOk)
}
// --------------------------------------------------------------------------------------------------------------------
type Post = {
author: string
title: string
content: string
}
const postValidator = (post: Post) => {
// return meaningful error messages when something is invalid
if (!post.author) return '"author" missing'
if (!post.title) return '"title" missing'
if (post.title.length > 120) return '"title" must be shorter than 120 characters'
if (!post.content) return '"content" missing'
if (post.title.length < 500) return '"content" must contain at least 500 characters'
// return `true` when validation passes
return true
}
const savePost = async (post: Post) => {
const validationResult = validate(post, postValidator)
if (validationResult.isException) return validationResult // pass forward exception
// saving the data when validation has passed
const id = 1 // await savePostToDatabase(post)
return success(id)
}
// --------------------------------------------------------------------------------------------------------------------
export const run = async () => {
const savePostResult = await savePost({
author: 'John Doe',
title: 'Error handling should be easier',
content: 'Lorem ipsum dolor, sit amet consectetur adipisicing elit. Amet, qui.',
})
if (savePostResult.isException) throw new Error(savePostResult())
console.info(`new post saved: ${savePostResult()}`)
}
run()