mirror of
https://github.com/rsteube/carapace-bin.git
synced 2025-05-24 08:31:15 +00:00
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
package action
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/rsteube/carapace"
|
|
)
|
|
|
|
type sample struct {
|
|
Id string
|
|
Description string
|
|
}
|
|
|
|
func ActionSamples() carapace.Action {
|
|
return carapace.ActionCallback(func(c carapace.Context) carapace.Action {
|
|
tmpfile, err := os.CreateTemp(os.TempDir(), "carapace-flutter-samples.json")
|
|
if err != nil {
|
|
return carapace.ActionMessage(err.Error())
|
|
}
|
|
err = tmpfile.Close() // just using ioutil.Tempfile for the random name
|
|
if err != nil {
|
|
return carapace.ActionMessage(err.Error())
|
|
}
|
|
err = os.Remove(tmpfile.Name()) // will be written by flutter and must not exist
|
|
if err != nil {
|
|
return carapace.ActionMessage(err.Error())
|
|
}
|
|
defer os.Remove(tmpfile.Name()) // remove after parsing content
|
|
return carapace.ActionExecCommand("flutter", "create", "--suppress-analytics", "--list-samples", tmpfile.Name())(func(output []byte) carapace.Action {
|
|
content, err := os.ReadFile(tmpfile.Name())
|
|
if err != nil {
|
|
return carapace.ActionMessage(err.Error())
|
|
}
|
|
|
|
var samples []sample
|
|
if err := json.Unmarshal(content, &samples); err != nil {
|
|
return carapace.ActionMessage(err.Error())
|
|
}
|
|
|
|
vals := make([]string, 0)
|
|
for _, sample := range samples {
|
|
vals = append(vals, sample.Id, sample.Description)
|
|
}
|
|
return carapace.ActionValuesDescribed(vals...)
|
|
}).Invoke(c).ToA() // ensure this is executed before `defer os.Remove`
|
|
}).Cache(1 * time.Hour)
|
|
}
|