441c43da2d16881384e16c45dc482b42a78bc20e
[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         "github.com/sirupsen/logrus"
23
24         "git.fd.io/govpp.git/binapigen/vppapi"
25 )
26
27 var debugMode = true
28
29 func logf(f string, v ...interface{}) {
30         if debugMode {
31                 logrus.Debugf(f, v...)
32         }
33 }
34
35 func GenerateBinapiFile(gen *Generator, file *File, outputDir string) *GenFile {
36         packageDir := filepath.Join(outputDir, file.PackageName)
37         filename := filepath.Join(packageDir, file.PackageName+outputFileExt)
38
39         g := gen.NewGenFile(filename)
40         g.file = file
41         g.packageDir = filepath.Join(outputDir, file.PackageName)
42
43         generatePackage(g, &g.buf)
44
45         return g
46 }
47
48 func GenerateRPC(gen *Generator, file *File, outputDir string) *GenFile {
49         packageDir := filepath.Join(outputDir, file.PackageName)
50         filename := filepath.Join(packageDir, file.PackageName+rpcFileSuffix+outputFileExt)
51
52         g := gen.NewGenFile(filename)
53         g.file = file
54         g.packageDir = filepath.Join(outputDir, file.PackageName)
55
56         generatePackageRPC(g, &g.buf)
57
58         return g
59 }
60
61 func Run(apiDir string, opts Options, f func(*Generator) error) {
62         if err := run(apiDir, opts, f); err != nil {
63                 fmt.Fprintf(os.Stderr, "%s: %v\n", filepath.Base(os.Args[0]), err)
64                 os.Exit(1)
65         }
66 }
67
68 func run(apiDir string, opts Options, f func(*Generator) error) error {
69         // parse API files
70         apifiles, err := vppapi.ParseDir(apiDir)
71         if err != nil {
72                 return err
73         }
74
75         g, err := New(opts, apifiles)
76         if err != nil {
77                 return err
78         }
79
80         if err := f(g); err != nil {
81                 return err
82         }
83
84         if err = g.Generate(); err != nil {
85                 return err
86         }
87
88         return nil
89 }