github.com/jmigpin/editor@v1.6.0/core/options.go (about)

     1  package core
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/jmigpin/editor/core/lsproto"
     8  	"github.com/jmigpin/editor/util/parseutil"
     9  )
    10  
    11  type Options struct {
    12  	Font        string
    13  	FontSize    float64
    14  	FontHinting string
    15  	DPI         float64
    16  
    17  	TabWidth     int
    18  	WrapLineRune int
    19  
    20  	ColorTheme     string
    21  	CommentsColor  int
    22  	StringsColor   int
    23  	ScrollBarWidth int
    24  	ScrollBarLeft  bool
    25  	Shadows        bool
    26  
    27  	SessionName string
    28  	Filenames   []string
    29  
    30  	UseMultiKey bool
    31  
    32  	Plugins string
    33  
    34  	LSProtos     RegistrationsOpt
    35  	PreSaveHooks PreSaveHooksOpt
    36  }
    37  
    38  //----------
    39  
    40  // implements flag.Value interface
    41  type RegistrationsOpt struct {
    42  	regs []*lsproto.Registration
    43  }
    44  
    45  func (ro *RegistrationsOpt) Set(s string) error {
    46  	reg, err := lsproto.NewRegistration(s)
    47  	if err != nil {
    48  		return err
    49  	}
    50  	ro.regs = append(ro.regs, reg)
    51  	return nil
    52  }
    53  
    54  func (ro *RegistrationsOpt) MustSet(s string) {
    55  	if err := ro.Set(s); err != nil {
    56  		panic(err)
    57  	}
    58  }
    59  
    60  func (ro *RegistrationsOpt) String() string {
    61  	u := []string{}
    62  	for _, reg := range ro.regs {
    63  		u = append(u, reg.String())
    64  	}
    65  	return fmt.Sprintf("%v", strings.Join(u, "\n"))
    66  }
    67  
    68  //----------
    69  
    70  // implements flag.Value interface
    71  type PreSaveHooksOpt struct {
    72  	regs []*PreSaveHook
    73  }
    74  
    75  func (o *PreSaveHooksOpt) Set(s string) error {
    76  	reg, err := newPreSaveHook(s)
    77  	if err != nil {
    78  		return err
    79  	}
    80  	o.regs = append(o.regs, reg)
    81  	return nil
    82  }
    83  
    84  func (o *PreSaveHooksOpt) MustSet(s string) {
    85  	if err := o.Set(s); err != nil {
    86  		panic(err)
    87  	}
    88  }
    89  
    90  func (o *PreSaveHooksOpt) String() string {
    91  	u := []string{}
    92  	for _, reg := range o.regs {
    93  		u = append(u, reg.String())
    94  	}
    95  	return fmt.Sprintf("%v", strings.Join(u, "\n"))
    96  }
    97  
    98  //----------
    99  
   100  type PreSaveHook struct {
   101  	Language string
   102  	Exts     []string
   103  	Cmd      string
   104  }
   105  
   106  func newPreSaveHook(s string) (*PreSaveHook, error) {
   107  	fields, err := parseutil.ParseFields(s, ',')
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  	minFields := 3
   112  	if len(fields) != minFields {
   113  		return nil, fmt.Errorf("expecting %v fields: %v", minFields, len(fields))
   114  	}
   115  
   116  	r := &PreSaveHook{}
   117  	r.Language = fields[0]
   118  	if r.Language == "" {
   119  		return nil, fmt.Errorf("empty language")
   120  	}
   121  	r.Exts = strings.Split(fields[1], " ")
   122  	r.Cmd = fields[2]
   123  
   124  	return r, nil
   125  }
   126  
   127  func (h *PreSaveHook) String() string {
   128  	u := []string{h.Language}
   129  
   130  	exts := strings.Join(h.Exts, " ")
   131  	if len(h.Exts) >= 2 {
   132  		exts = fmt.Sprintf("%q", exts)
   133  	}
   134  	u = append(u, exts)
   135  
   136  	cmd := h.Cmd
   137  	cmd2 := parseutil.AddEscapes(cmd, '\\', " ,")
   138  	if cmd != cmd2 {
   139  		cmd = fmt.Sprintf("%q", cmd)
   140  	}
   141  	u = append(u, cmd)
   142  
   143  	return strings.Join(u, ",")
   144  }