This repository has been archived by the owner on Aug 28, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuncynim.nimble
135 lines (83 loc) · 2.25 KB
/
funcynim.nimble
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
func srcDirName*(): string =
"src"
version = "1.0.0"
author = "thenjip"
description = "Utility library to ease functional programming in Nim."
license = "MIT"
srcDir = srcDirName()
requires "nim >= 1.6.0", "nim_curry >= 0.1.0"
import std/[macros, os, sequtils, strformat, strutils]
func taskBuildDirName*(): string =
"nimble-build"
func taskScriptDirName(): string =
"tasks"
type
Task* {.pure.} = enum
TestC
TestCxx
TestObjc
TestJs
Docs
Clean
TestTask* = Task.TestC .. Task.TestJs
func backendName*(self: TestTask): string =
const names: array[TestTask, string] = [
"C",
"C++",
"Objective-C",
"JavaScript"
]
names[self]
func nimCmdName*(self: TestTask): string =
const names: array[TestTask, string] = ["cc", "cpp", "objc", "js"]
names[self]
func name*(self: Task): string =
const names: array[Task, string] = [
"test-c",
"test-cxx",
"test-objc",
"test-js",
"docs",
"clean"
]
names[self]
func scriptName*(self: Task): string =
self.name().replace('-', '_')
func identifier(self: Task): NimNode =
self.name().ident()
func description*(self: Task): string =
func description(self: TestTask): string =
fmt"Build the tests using the {self.backendName()} backend and run them."
const descriptions: array[Task, string] = [
Task.TestC.TestTask.description(),
Task.TestCxx.TestTask.description(),
Task.TestObjc.TestTask.description(),
Task.TestJs.TestTask.description(),
"Build the API doc.",
fmt"""Remove "{taskBuildDirName()}" directory."""
]
descriptions[self]
# Tasks
proc execScript(self: Task) =
func nims(file: string): string =
file.addFileExt("nims")
let script = taskScriptDirName().`/`(self.scriptName().nims())
fmt"e {script.quoteShell()}".selfExec()
macro define(self: static Task): untyped =
let
identifier = self.identifier()
literal = self.newLit()
quote do:
task `identifier`, `literal`.description():
`literal`.execScript()
macro defineTasks(): untyped =
toSeq(Task.items())
.map(newLit)
.map(
proc (literal: auto): auto =
quote do:
`literal`.define()
).newStmtList()
defineTasks()
task test, """An alias for "test-c".""":
`test-cTask`()