Skip to content

Commit 73f242a

Browse files
committed
Updated to include NewsAPI
1 parent 91cac3f commit 73f242a

File tree

8 files changed

+173
-20
lines changed

8 files changed

+173
-20
lines changed

cmd/api/bitwarden.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func bwParse(flags *Flags, opts ...client.ClientOpt) error {
9999
///////////////////////////////////////////////////////////////////////////////
100100
// API METHODS
101101

102-
func bwAuth(w *tablewriter.TableWriter) error {
102+
func bwAuth(w *tablewriter.TableWriter, _ []string) error {
103103
// Load session or create a new one
104104
session, err := bwReadSession()
105105
if err != nil {
@@ -136,7 +136,7 @@ func bwAuth(w *tablewriter.TableWriter) error {
136136
return nil
137137
}
138138

139-
func bwSync(w *tablewriter.TableWriter) error {
139+
func bwSync(w *tablewriter.TableWriter, _ []string) error {
140140
// Load session or create a new one
141141
session, err := bwReadSession()
142142
if err != nil {
@@ -167,7 +167,7 @@ func bwSync(w *tablewriter.TableWriter) error {
167167
return nil
168168
}
169169

170-
func bwFolders(w *tablewriter.TableWriter) error {
170+
func bwFolders(w *tablewriter.TableWriter, _ []string) error {
171171
// Load the profile
172172
profile, err := bwReadProfile()
173173
if err != nil {
@@ -214,7 +214,7 @@ func bwFolders(w *tablewriter.TableWriter) error {
214214
return nil
215215
}
216216

217-
func bwLogins(w *tablewriter.TableWriter) error {
217+
func bwLogins(w *tablewriter.TableWriter, _ []string) error {
218218
// Load the profile
219219
profile, err := bwReadProfile()
220220
if err != nil {
@@ -269,7 +269,7 @@ func bwLogins(w *tablewriter.TableWriter) error {
269269
return nil
270270
}
271271

272-
func bwGetPassword(w *tablewriter.TableWriter) error {
272+
func bwGetPassword(w *tablewriter.TableWriter, _ []string) error {
273273
return ErrNotImplemented
274274
}
275275

cmd/api/cmd.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,38 @@ type Fn struct {
2222
Description string
2323
MinArgs uint
2424
MaxArgs uint
25-
Call func(*tablewriter.TableWriter) error
25+
Call func(*tablewriter.TableWriter, []string) error
2626
}
2727

2828
///////////////////////////////////////////////////////////////////////////////
2929
// PUBLIC METHODS
3030

31-
func (c *Cmd) Get(args []string) (*Fn, error) {
31+
func (c *Cmd) Get(args []string) (*Fn, []string, error) {
3232
// Get the command function
3333
var fn *Fn
3434
var nargs uint
35+
var out []string
3536
if len(args) == 0 {
3637
fn = c.getFn("")
3738
} else {
3839
fn = c.getFn(args[0])
3940
nargs = uint(len(args) - 1)
41+
out = args[1:]
4042
}
4143
if fn == nil {
4244
// No arguments and no default command
43-
return nil, nil
45+
return nil, nil, nil
4446
}
4547

4648
// Check number of arguments
4749
if fn.MinArgs != 0 && nargs < fn.MinArgs {
48-
return nil, fmt.Errorf("not enough arguments for %q", fn.Name)
50+
return nil, nil, fmt.Errorf("not enough arguments for %q", fn.Name)
4951
} else if nargs > fn.MaxArgs {
50-
return nil, fmt.Errorf("too many arguments for %q", fn.Name)
52+
return nil, nil, fmt.Errorf("too many arguments for %q", fn.Name)
5153
}
5254

5355
// Return the command
54-
return fn, nil
56+
return fn, out, nil
5557
}
5658

5759
///////////////////////////////////////////////////////////////////////////////

cmd/api/flags.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ func (flags *Flags) Parse(args []string) error {
9292
// Parse the commands
9393
for _, cmd := range flags.cmds {
9494
if err := cmd.Parse(flags, opts...); err != nil {
95-
return fmt.Errorf("%v: %w", cmd.Name, err)
95+
fmt.Fprintf(os.Stderr, "%v: %v\n", cmd.Name, err)
96+
return err
9697
}
9798
}
9899

cmd/api/ipify.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func ipifyParse(flags *Flags, opts ...client.ClientOpt) error {
3131
return nil
3232
}
3333

34-
func ipifyGetAddress(w *tablewriter.TableWriter) error {
34+
func ipifyGetAddress(w *tablewriter.TableWriter, _ []string) error {
3535
addr, err := ipifyClient.Get()
3636
if err != nil {
3737
return err

cmd/api/main.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ func main() {
1616
// Register commands
1717
ipifyRegister(flags)
1818
bwRegister(flags)
19+
newsapiRegister(flags)
1920

2021
// Parse
2122
if err := flags.Parse(os.Args[1:]); errors.Is(err, ErrHelp) {
@@ -38,19 +39,19 @@ func main() {
3839
}
3940

4041
// Get function then run it
41-
fn, err := cmd.Get(flags.Args()[1:])
42+
fn, args, err := cmd.Get(flags.Args()[1:])
4243
if err != nil {
4344
fmt.Fprintln(os.Stderr, err)
4445
os.Exit(-1)
4546
} else if fn == nil {
4647
flags.PrintCommandUsage(cmd)
47-
} else if err := Run(fn); err != nil {
48+
} else if err := Run(fn, args); err != nil {
4849
fmt.Fprintln(os.Stderr, err)
4950
os.Exit(-2)
5051
}
5152
}
5253

53-
func Run(fn *Fn) error {
54+
func Run(fn *Fn, args []string) error {
5455
writer := tablewriter.New(os.Stdout, tablewriter.OptOutputText(), tablewriter.OptHeader())
55-
return fn.Call(writer)
56+
return fn.Call(writer, args)
5657
}

cmd/api/newsapi.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"strings"
7+
8+
"github.com/djthorpe/go-tablewriter"
9+
"github.com/mutablelogic/go-client"
10+
"github.com/mutablelogic/go-client/pkg/newsapi"
11+
)
12+
13+
///////////////////////////////////////////////////////////////////////////////
14+
// GLOBALS
15+
16+
var (
17+
newsapiName = "newsapi"
18+
newsapiClient *newsapi.Client
19+
newsapiCategory string
20+
newsapiLanguage string
21+
newsapiCountry string
22+
)
23+
24+
///////////////////////////////////////////////////////////////////////////////
25+
// LIFECYCLE
26+
27+
func newsapiRegister(flags *Flags) {
28+
// Register flags required
29+
flags.String(newsapiName, "newsapi-key", "${NEWSAPI_KEY}", "API Key")
30+
flags.String(newsapiName, "category", "", "News category: business, entertainment, general, health, science, sports, technology")
31+
flags.String(newsapiName, "language", "", "ISO 639 language code")
32+
flags.String(newsapiName, "country", "", "ISO 3166 country code")
33+
34+
flags.Register(Cmd{
35+
Name: newsapiName,
36+
Description: "Obtain news headlines from https://newsapi.org/",
37+
Parse: inewsapiParse,
38+
Fn: []Fn{
39+
{Name: "sources", Call: newsapiSources, Description: "Return sources of news"},
40+
{Name: "headlines", Call: newsapiHeadlines, Description: "Return top headlines from news sources"},
41+
{Name: "search", Call: newsapiArticles, Description: "Return articles from news sources with search term", MaxArgs: 1},
42+
},
43+
})
44+
}
45+
46+
func inewsapiParse(flags *Flags, opts ...client.ClientOpt) error {
47+
apiKey := flags.GetString("newsapi-key")
48+
if apiKey == "" {
49+
return fmt.Errorf("missing -newsapi-key flag")
50+
}
51+
if client, err := newsapi.New(flags.GetString("newsapi-key"), opts...); err != nil {
52+
return err
53+
} else {
54+
newsapiClient = client
55+
}
56+
57+
// Set category
58+
newsapiCategory = strings.ToLower(flags.GetString("category"))
59+
newsapiLanguage = strings.ToLower(flags.GetString("language"))
60+
newsapiCountry = strings.ToLower(flags.GetString("country"))
61+
62+
// Return success
63+
return nil
64+
}
65+
66+
///////////////////////////////////////////////////////////////////////////////
67+
// METHODS
68+
69+
func newsapiSources(w *tablewriter.TableWriter, _ []string) error {
70+
// Set options
71+
opts := []newsapi.Opt{}
72+
if newsapiCategory != "" {
73+
opts = append(opts, newsapi.OptCategory(newsapiCategory))
74+
}
75+
if newsapiLanguage != "" {
76+
opts = append(opts, newsapi.OptLanguage(newsapiLanguage))
77+
}
78+
if newsapiCountry != "" {
79+
opts = append(opts, newsapi.OptCountry(newsapiCountry))
80+
}
81+
82+
// Request -> Response
83+
sources, err := newsapiClient.Sources(opts...)
84+
if err != nil {
85+
return err
86+
}
87+
88+
// Write table
89+
return w.Write(sources)
90+
}
91+
92+
func newsapiHeadlines(w *tablewriter.TableWriter, _ []string) error {
93+
// Set options
94+
opts := []newsapi.Opt{}
95+
if newsapiCategory != "" {
96+
opts = append(opts, newsapi.OptCategory(newsapiCategory))
97+
}
98+
if newsapiLanguage != "" {
99+
opts = append(opts, newsapi.OptLanguage(newsapiLanguage))
100+
}
101+
if newsapiCountry != "" {
102+
opts = append(opts, newsapi.OptCountry(newsapiCountry))
103+
}
104+
105+
// Request -> Response
106+
articles, err := newsapiClient.Headlines(opts...)
107+
if err != nil {
108+
return err
109+
}
110+
111+
// Write table
112+
return w.Write(articles)
113+
}
114+
115+
func newsapiArticles(w *tablewriter.TableWriter, args []string) error {
116+
// Set options
117+
opts := []newsapi.Opt{}
118+
if newsapiCategory != "" {
119+
opts = append(opts, newsapi.OptCategory(newsapiCategory))
120+
}
121+
if newsapiLanguage != "" {
122+
opts = append(opts, newsapi.OptLanguage(newsapiLanguage))
123+
}
124+
if newsapiCountry != "" {
125+
opts = append(opts, newsapi.OptCountry(newsapiCountry))
126+
}
127+
// Set query
128+
if len(args) > 0 {
129+
q := strconv.Quote(args[0])
130+
opts = append(opts, newsapi.OptQuery(q))
131+
}
132+
133+
// Request -> Response
134+
articles, err := newsapiClient.Articles(opts...)
135+
if err != nil {
136+
return err
137+
}
138+
139+
// Write table
140+
return w.Write(articles)
141+
}

pkg/bitwarden/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
opts "github.com/mutablelogic/go-client"
1010
bitwarden "github.com/mutablelogic/go-client/pkg/bitwarden"
1111
crypto "github.com/mutablelogic/go-client/pkg/bitwarden/crypto"
12-
"github.com/mutablelogic/go-client/pkg/bitwarden/schema"
12+
schema "github.com/mutablelogic/go-client/pkg/bitwarden/schema"
1313
assert "github.com/stretchr/testify/assert"
1414
)
1515

@@ -37,7 +37,7 @@ func Test_client_005(t *testing.T) {
3737
assert.NoError(err)
3838

3939
// Login a new session
40-
session := bitwarden.NewSession()
40+
session := schema.NewSession()
4141
err = client.Login(session, bitwarden.OptCredentials(GetCredentials(t)), bitwarden.OptDevice(schema.Device{
4242
Name: "mydevice",
4343
}))

pkg/newsapi/sources.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,15 @@ type respSources struct {
3131
///////////////////////////////////////////////////////////////////////////////
3232
// PUBLIC METHODS
3333

34-
// Sources returns all the models
34+
// Sources returns all the models. The options which can be passed are:
35+
//
36+
// OptCategory: The category you would like to get sources for. Possible
37+
// options are business, entertainment, general, health, science, sports,
38+
// technology.
39+
//
40+
// OptLanguage: The language you would like to get sources for
41+
//
42+
// OptCountry: The country you would like to get sources for
3543
func (c *Client) Sources(opt ...Opt) ([]Source, error) {
3644
var response respSources
3745
var query opts

0 commit comments

Comments
 (0)