From 8f77f5dd6dd729b6fb07438ec58b7f5db45d0487 Mon Sep 17 00:00:00 2001 From: Knut Ahlers Date: Sat, 29 Jun 2019 22:30:22 +0200 Subject: [PATCH] Implement share command Signed-off-by: Knut Ahlers --- cmd/cloudbox/main.go | 2 ++ cmd/cloudbox/share.go | 56 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 cmd/cloudbox/share.go diff --git a/cmd/cloudbox/main.go b/cmd/cloudbox/main.go index 4ed7529..58b37be 100644 --- a/cmd/cloudbox/main.go +++ b/cmd/cloudbox/main.go @@ -15,11 +15,13 @@ type commandFunc func() error const ( cmdHelp command = "help" + cmdShare command = "share" cmdSync command = "sync" cmdWriteConfig command = "write-config" ) var cmdFuncs = map[command]commandFunc{ + cmdShare: execShare, cmdSync: execSync, cmdWriteConfig: execWriteSampleConfig, } diff --git a/cmd/cloudbox/share.go b/cmd/cloudbox/share.go new file mode 100644 index 0000000..2f1694b --- /dev/null +++ b/cmd/cloudbox/share.go @@ -0,0 +1,56 @@ +package main + +import ( + "fmt" + "os" + "text/template" + + "github.com/pkg/errors" + + "github.com/Luzifer/cloudbox/providers" + "github.com/Luzifer/rconfig" +) + +func execShare() error { + conf, err := loadConfig(false) + if err != nil { + return errors.Wrap(err, "Unable to load config") + } + + remote, err := providerFromURI(conf.Sync.RemoteURI) + if err != nil { + return errors.Wrap(err, "Unable to initialize remote provider") + } + + if !remote.Capabilities().Has(providers.CapShare) { + return errors.New("Remote provider does not support sharing") + } + + if len(rconfig.Args()) < 3 { + return errors.New("No filename provided to share") + } + + relativeName := rconfig.Args()[2] + providerURL, err := remote.Share(relativeName) + if err != nil { + return errors.Wrap(err, "Unable to share file") + } + + if !conf.Share.OverrideURI { + fmt.Println(providerURL) + return nil + } + + tpl, err := template.New("share_uri").Parse(conf.Share.URITemplate) + if err != nil { + return errors.Wrap(err, "Unable to parse URI template") + } + + if err := tpl.Execute(os.Stdout, map[string]interface{}{ + "file": relativeName, + }); err != nil { + return errors.Wrap(err, "Unable to render share URI") + } + + return nil +}