1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package cue
16
17 import (
18 "bytes"
19 "fmt"
20 "math/big"
21
22 "cuelang.org/go/cue/ast"
23 "cuelang.org/go/cue/format"
24 "cuelang.org/go/internal/core/export"
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 func (v Value) Format(state fmt.State, verb rune) {
66 if v.v == nil {
67 fmt.Fprint(state, "<nil>")
68 return
69 }
70
71 switch verb {
72 case 'a':
73 formatCUE(state, v, true, true)
74 case 'c':
75 formatCUE(state, v, true, false)
76 case 'v':
77 formatCUE(state, v, false, false)
78
79 case 'd', 'o', 'O', 'U':
80 var i big.Int
81 if _, err := v.Int(&i); err != nil {
82 formatCUE(state, v, false, false)
83 return
84 }
85 i.Format(state, verb)
86
87 case 'f', 'e', 'E', 'g', 'G':
88 d, err := v.Decimal()
89 if err != nil {
90 formatCUE(state, v, false, false)
91 return
92 }
93 d.Format(state, verb)
94
95 case 's', 'q':
96
97 msg := "%s"
98 if verb == 'q' {
99 msg = "%q"
100 }
101
102 if b, err := v.Bytes(); err == nil {
103 fmt.Fprintf(state, msg, b)
104 } else {
105 s := fmt.Sprintf("%+v", v)
106 fmt.Fprintf(state, msg, s)
107 }
108
109 case 'x', 'X':
110 switch v.Kind() {
111 case StringKind, BytesKind:
112 b, _ := v.Bytes()
113
114 msg := "%x"
115 if verb == 'X' {
116 msg = "%X"
117 }
118 fmt.Fprintf(state, msg, b)
119
120 case IntKind, NumberKind:
121 var i big.Int
122 _, _ = v.Int(&i)
123 i.Format(state, verb)
124
125 case FloatKind:
126 dec, _ := v.Decimal()
127 dec.Format(state, verb)
128
129 default:
130 formatCUE(state, v, false, false)
131 }
132
133 default:
134 formatCUE(state, v, false, false)
135 }
136 }
137
138 func formatCUE(state fmt.State, v Value, showDocs, showAll bool) {
139
140 pkgPath := v.instance().ID()
141
142 p := *export.Simplified
143
144 isDef := false
145 switch {
146 case state.Flag('#'):
147 isDef = true
148 p = export.Profile{
149 ShowOptional: true,
150 ShowDefinitions: true,
151 ShowHidden: true,
152 }
153
154 case state.Flag('+'):
155 p = *export.Final
156 fallthrough
157
158 default:
159 p.ShowHidden = showAll
160 }
161
162 p.ShowDocs = showDocs
163 p.ShowAttributes = showAll
164
165 var n ast.Node
166 if isDef {
167 n, _ = p.Def(v.idx, pkgPath, v.v)
168 } else {
169 n, _ = p.Value(v.idx, pkgPath, v.v)
170 }
171
172 formatExpr(state, n)
173 }
174
175 func formatExpr(state fmt.State, n ast.Node) {
176 opts := make([]format.Option, 0, 3)
177 if state.Flag('-') {
178 opts = append(opts, format.Simplify())
179 }
180
181 if width, ok := state.Width(); ok {
182 opts = append(opts, format.IndentPrefix(width))
183 }
184
185 if tabwidth, ok := state.Precision(); ok {
186
187 opts = append(opts,
188 format.UseSpaces(tabwidth),
189 format.TabIndent(false))
190 }
191
192
193
194
195
196
197
198 b, _ := format.Node(n, opts...)
199 b = bytes.Trim(b, "\n\r")
200 _, _ = state.Write(b)
201 }
202
View as plain text