-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathparser.go
More file actions
46 lines (42 loc) · 1.15 KB
/
parser.go
File metadata and controls
46 lines (42 loc) · 1.15 KB
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
package lang
import (
"context"
"errors"
"io"
"github.com/freeconf/lang/pb"
"github.com/freeconf/yang/meta"
"github.com/freeconf/yang/parser"
)
type ParserService struct {
pb.UnimplementedParserServer
d *Driver
}
func (s *ParserService) LoadModule(ctx context.Context, in *pb.LoadModuleRequest) (*pb.LoadModuleResponse, error) {
// In golang, apparently you cannot put a func pointer type into a map, so we put the pointer
// in and so we need to expected that here when resolving the handle
ypath := resolveOpener(s.d.handles, in.SourceHnd)
var m *meta.Module
var err error
if in.GetName() != "" {
m, err = parser.LoadModule(ypath, in.GetName())
if err != nil {
return nil, err
}
} else if in.GetStreamHnd() != 0 {
rdr := s.d.handles.Require(in.GetStreamHnd()).(io.Reader)
data, err := io.ReadAll(rdr)
if err != nil {
return nil, err
}
m, err = parser.LoadModuleFromString(ypath, string(data))
if err != nil {
return nil, err
}
} else {
return nil, errors.New("must supply either stream or module name")
}
return &pb.LoadModuleResponse{
ModuleHnd: s.d.handles.Put(m),
Module: NewMetaEncoder().Encode(m),
}, nil
}