@@ -6,14 +6,13 @@ import (
6
6
"flag"
7
7
"fmt"
8
8
"io"
9
- "io/ioutil"
10
9
"os"
11
10
"path/filepath"
11
+ "text/template"
12
12
13
13
"github.com/matryer/moq/pkg/moq"
14
14
)
15
15
16
- // Version is the command version, injected at build time.
17
16
var Version string = "dev"
18
17
19
18
type userFlags struct {
@@ -64,50 +63,140 @@ func main() {
64
63
}
65
64
66
65
func run (flags userFlags ) error {
67
- if len (flags .args ) < 2 {
66
+ var (
67
+ buf bytes.Buffer
68
+ out io.Writer = os .Stdout
69
+ srcDir string
70
+ )
71
+
72
+ if NotEnoughArguments (flags ) {
68
73
return errors .New ("not enough arguments" )
69
74
}
70
75
71
- if flags .remove && flags .outFile != "" {
72
- if err := os .Remove (flags .outFile ); err != nil {
73
- if ! errors .Is (err , os .ErrNotExist ) {
74
- return err
75
- }
76
+ if ShouldRemoveFile (flags ) {
77
+ if err := RemoveFile (flags .outFile ); err != nil && ! os .IsNotExist (err ) {
78
+ return err
76
79
}
77
80
}
78
81
79
- var buf bytes.Buffer
80
- var out io.Writer = os .Stdout
81
- if flags .outFile != "" {
82
+ if ShouldWriteToFile (flags ) {
82
83
out = & buf
83
84
}
84
85
85
- srcDir , args := flags .args [0 ], flags .args [1 :]
86
- m , err := moq .New (moq.Config {
87
- SrcDir : srcDir ,
88
- PkgName : flags .pkgName ,
89
- Formatter : flags .formatter ,
90
- StubImpl : flags .stubImpl ,
91
- SkipEnsure : flags .skipEnsure ,
92
- WithResets : flags .withResets ,
93
- })
86
+ srcDir , cleanUp , err := getSourceDirectory (flags )
94
87
if err != nil {
95
88
return err
96
89
}
90
+ defer cleanUp ()
97
91
98
- if err = m .Mock (out , args ... ); err != nil {
92
+ m , err := CreateMoq (flags , srcDir )
93
+ if err != nil {
94
+ return err
95
+ }
96
+
97
+ if err := m .Mock (out , flags .args [1 :]... ); err != nil {
99
98
return err
100
99
}
101
100
102
101
if flags .outFile == "" {
103
102
return nil
104
103
}
105
104
106
- // create the file
107
- err = os .MkdirAll (filepath .Dir (flags .outFile ), 0o750 )
105
+ if err := CreateOutputFile (flags .outFile , buf .Bytes ()); err != nil {
106
+ return err
107
+ }
108
+
109
+ return nil
110
+ }
111
+
112
+ func getSourceDirectory (flags userFlags ) (string , func (), error ) {
113
+ if DirectoryExists (flags .args [0 ]) {
114
+ return flags .args [0 ], func () {}, nil
115
+ }
116
+
117
+ pwd , err := os .Getwd ()
118
+ if err != nil {
119
+ return "" , func () {}, err
120
+ }
121
+
122
+ tempDir , err := os .MkdirTemp (pwd , "moq_force_local_interface_mode_" )
123
+ if err != nil {
124
+ return "" , func () {}, err
125
+ }
126
+
127
+ if err := GenerateMoqForceLocalInterface (flags , tempDir ); err != nil {
128
+ return "" , func () {}, err
129
+ }
130
+
131
+ return tempDir , func () { os .RemoveAll (tempDir ) }, nil
132
+
133
+ }
134
+
135
+ func NotEnoughArguments (flags userFlags ) bool {
136
+ return len (flags .args ) < 2
137
+ }
138
+
139
+ func ShouldRemoveFile (flags userFlags ) bool {
140
+ return flags .remove && flags .outFile != ""
141
+ }
142
+
143
+ func RemoveFile (filePath string ) error {
144
+ return os .Remove (filePath )
145
+ }
146
+
147
+ func ShouldWriteToFile (flags userFlags ) bool {
148
+ return flags .outFile != ""
149
+ }
150
+
151
+ func DirectoryExists (directoryPath string ) bool {
152
+ _ , err := os .Stat (directoryPath )
153
+ return err == nil
154
+ }
155
+
156
+ func GenerateMoqForceLocalInterface (flags userFlags , tempDir string ) error {
157
+ tmpl , err := template .New ("force_local_interface" ).Parse (moqForceLocalInterface )
108
158
if err != nil {
109
159
return err
110
160
}
111
161
112
- return ioutil .WriteFile (flags .outFile , buf .Bytes (), 0o600 )
162
+ var buf bytes.Buffer
163
+
164
+ err = tmpl .Execute (& buf , map [string ]interface {}{
165
+ "SrcPkgQualifier" : filepath .Base (flags .args [0 ]),
166
+ "Import" : flags .args [0 ],
167
+ "InterfaceName" : flags .args [1 ],
168
+ })
169
+ if err != nil {
170
+ return err
171
+ }
172
+
173
+ return os .WriteFile (filepath .Join (tempDir , "moq_force_local_interface.go" ), buf .Bytes (), 0600 )
174
+ }
175
+
176
+ func CreateMoq (flags userFlags , srcDir string ) (* moq.Mocker , error ) {
177
+ return moq .New (moq.Config {
178
+ SrcDir : srcDir ,
179
+ PkgName : flags .pkgName ,
180
+ Formatter : flags .formatter ,
181
+ StubImpl : flags .stubImpl ,
182
+ SkipEnsure : flags .skipEnsure ,
183
+ WithResets : flags .withResets ,
184
+ })
185
+ }
186
+
187
+ func CreateOutputFile (filePath string , data []byte ) error {
188
+ if err := os .MkdirAll (filepath .Dir (filePath ), 0750 ); err != nil {
189
+ return err
190
+ }
191
+ return os .WriteFile (filePath , data , 0600 )
113
192
}
193
+
194
+ const moqForceLocalInterface = `// Code generated by moq; DO NOT EDIT
195
+ // github.com/matryer/moq
196
+
197
+ package {{.SrcPkgQualifier}}
198
+
199
+ import "{{.Import}}"
200
+
201
+ type {{.InterfaceName}} {{$.SrcPkgQualifier}}.{{.InterfaceName}}
202
+ `
0 commit comments