annotate vendor/github.com/yosssi/gcss/variable.go @ 67:4edfa07d5fe0 draft

bfchroma turned out to be a hassle Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Thu, 07 Sep 2023 16:52:43 +0000
parents 787b5ee0289d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package gcss
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "io"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 // variable represents a GCSS variable.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 type variable struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 elementBase
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 name string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 value string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 // WriteTo writes the variable to the writer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 func (v *variable) WriteTo(w io.Writer) (int64, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 n, err := w.Write([]byte(v.value))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 return int64(n), err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 // variableNV extracts a variable name and value
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 // from the line.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 func variableNV(ln *line) (string, string, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 s := strings.TrimSpace(ln.s)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 if !strings.HasPrefix(s, dollarMark) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 return "", "", fmt.Errorf("variable must start with %q [line: %d]", dollarMark, ln.no)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 nv := strings.SplitN(s, space, 2)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 if len(nv) < 2 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 return "", "", fmt.Errorf("variable's name and value should be divided by a space [line: %d]", ln.no)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 if !strings.HasSuffix(nv[0], colon) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 return "", "", fmt.Errorf("variable's name should end with a colon [line: %d]", ln.no)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 return strings.TrimSuffix(strings.TrimPrefix(nv[0], dollarMark), colon), nv[1], nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 // newVariable creates and returns a variable.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 func newVariable(ln *line, parent element) (*variable, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 name, value, err := variableNV(ln)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 return nil, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 if strings.HasSuffix(value, semicolon) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 return nil, fmt.Errorf("variable must not end with %q", semicolon)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 return &variable{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 elementBase: newElementBase(ln, parent),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 name: name,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 value: value,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 }, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 }