summary refs log tree commit diff stats
path: root/tests/vm/tanonproc.nim
blob: 1176c104e32eee1d01b4734f7c42088436c55dca (plain) (blame)
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
discard """
  output: '''`Test`'''
"""

# bug #3561

import macros, sugar, strutils

type
  Option[T] = ref object
    case valid: bool
    of true:
      data: T
    else:
      discard

proc some[T](v: T): Option[T] = Option[T](valid: true, data: v)
proc none[T](v: T): Option[T] = Option[T](valid: false)
proc none(T: typedesc): Option[T] = Option[T](valid: false)

proc map[T,U](o: Option[T], f: T -> U): Option[U] =
  case o.valid
  of true:
    f(o.data).some
  else:
    U.none

proc notEmpty(o: Option[string]): Option[string] =
  case o.valid
  of true:
    if o.data.strip == "": string.none else: o.data.strip.some
  else:
    o

proc getOrElse[T](o: Option[T], def: T): T =
  case o.valid
  of true:
    o.data
  else:
    def

proc quoteStr(s: string): Option[string] =
  s.some.notEmpty.map(v => "`" & v & "`")

macro str(s: string): void =
  let x = s.strVal
  let y = quoteStr(x)
  let sn = newStrLitNode(y.getOrElse("NONE"))
  result = quote do:
    echo `sn`

str"Test"