Fix codec fallback and generate type imports
[govpp.git] / binapigen / run.go
1 //  Copyright (c) 2020 Cisco and/or its affiliates.
2 //
3 //  Licensed under the Apache License, Version 2.0 (the "License");
4 //  you may not use this file except in compliance with the License.
5 //  You may obtain a copy of the License at:
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 //  Unless required by applicable law or agreed to in writing, software
10 //  distributed under the License is distributed on an "AS IS" BASIS,
11 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 //  See the License for the specific language governing permissions and
13 //  limitations under the License.
14
15 package binapigen
16
17 import (
18         "fmt"
19         "os"
20         "path/filepath"
21
22         "git.fd.io/govpp.git/binapigen/vppapi"
23 )
24
25 const (
26         outputFileExt = ".ba.go" // file extension of the Go generated files
27         rpcFileSuffix = "_rpc"   // file name suffix for the RPC services
28 )
29
30 func Run(apiDir string, opts Options, f func(*Generator) error) {
31         if err := run(apiDir, opts, f); err != nil {
32                 fmt.Fprintf(os.Stderr, "%s: %v\n", filepath.Base(os.Args[0]), err)
33                 os.Exit(1)
34         }
35 }
36
37 func run(apiDir string, opts Options, f func(*Generator) error) error {
38         // parse API files
39         apifiles, err := vppapi.ParseDir(apiDir)
40         if err != nil {
41                 return err
42         }
43
44         g, err := New(opts, apifiles)
45         if err != nil {
46                 return err
47         }
48
49         if err := f(g); err != nil {
50                 return err
51         }
52
53         if err = g.Generate(); err != nil {
54                 return err
55         }
56
57         return nil
58 }
59
60 func GenerateBinapi(gen *Generator, file *File, outputDir string) *GenFile {
61         packageDir := filepath.Join(outputDir, file.PackageName)
62         filename := filepath.Join(packageDir, file.PackageName+outputFileExt)
63
64         g := gen.NewGenFile(filename)
65         g.file = file
66         g.outputDir = outputDir
67
68         generateFileBinapi(g, &g.buf)
69
70         return g
71 }
72
73 func GenerateRPC(gen *Generator, file *File, outputDir string) *GenFile {
74         packageDir := filepath.Join(outputDir, file.PackageName)
75         filename := filepath.Join(packageDir, file.PackageName+rpcFileSuffix+outputFileExt)
76
77         g := gen.NewGenFile(filename)
78         g.file = file
79         g.outputDir = outputDir
80
81         generateFileRPC(g, &g.buf)
82
83         return g
84 }