Skip to content

Commit 455cba4

Browse files
authored
Merge pull request #8 from ezeoleaf/new-blogs
add searching mode and sync new blogs
2 parents 3f68592 + 327718a commit 455cba4

7 files changed

Lines changed: 73 additions & 53 deletions

File tree

cmd/tblogs/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
)
99

1010
func main() {
11-
cfg, err := config.LoadConfig("")
11+
cfg, err := config.LoadConfig()
1212
if err != nil {
1313
log.Fatalf("failed to load config: %v", err)
1414
}

internal/app/app.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func (a *App) Run() {
8282

8383
defer func() {
8484
a.Config.App.LastLogin = a.Config.App.CurrentLogin
85-
err := config.SaveConfig(a.Config, "")
85+
err := config.SaveConfig(a.Config)
8686
if err != nil {
8787
log.Printf("failed to save config: %v", err)
8888
}

internal/app/blogs.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package app
22

33
import (
44
"log"
5+
"slices"
56
"strings"
67
"time"
78

@@ -86,17 +87,17 @@ func (a *App) filterBlogsList(listBlogs *tview.List, term string) {
8687
for _, blog := range a.Config.Blogs {
8788
if term == "" || strings.Contains(strings.ToLower(blog.Name), strings.ToLower(term)) {
8889
found = true
89-
isIn := false
90-
for _, id := range a.Config.App.FollowingBlogs {
91-
if id == blog.Name {
92-
isIn = true
93-
break
94-
}
95-
}
90+
isIn := slices.Contains(a.Config.App.FollowingBlogs, blog.Name)
91+
9692
r := emptyRune
9793
if isIn {
9894
r = followRune
9995
}
96+
97+
if term != "" {
98+
listBlogs.AddItem("=== SEARCHING MODE === "+term, "", 0, nil)
99+
}
100+
100101
listBlogs.AddItem(blog.Name, blog.Feed, r, func() {
101102
listPosts.Clear()
102103
listPosts.AddItem("Loading...", blog.Feed, 0, nil)
@@ -206,7 +207,7 @@ func (a *App) savePost(listPosts *tview.List, post *gofeed.Item, refreshHome, in
206207
a.Config.App.SavedPosts = append(a.Config.App.SavedPosts[:ix], a.Config.App.SavedPosts[ix+1:]...)
207208
}
208209

209-
err := config.SaveConfig(a.Config, "")
210+
err := config.SaveConfig(a.Config)
210211
if err != nil {
211212
log.Printf("failed to save config: %v", err)
212213
return
@@ -255,7 +256,7 @@ func (a *App) followBlogs(listBlogs *tview.List) {
255256
a.Config.App.FollowingBlogs = append(a.Config.App.FollowingBlogs[:ix], a.Config.App.FollowingBlogs[ix+1:]...)
256257
}
257258

258-
err := config.SaveConfig(a.Config, "")
259+
err := config.SaveConfig(a.Config)
259260
if err != nil {
260261
log.Printf("failed to save config: %v", err)
261262
}

internal/app/home.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (a *App) generateHomeList(listHome *tview.List) {
127127

128128
if event.Key() == tcell.KeyCtrlL {
129129
a.Config.App.LastLoginMode = !a.Config.App.LastLoginMode
130-
err := config.SaveConfig(a.Config, "")
130+
err := config.SaveConfig(a.Config)
131131
if err != nil {
132132
log.Printf("failed to save config: %v", err)
133133
}

internal/app/savedPosts.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func (a *App) generateSavedPosts(listSavedPosts *tview.List) {
4444
// // Remove the post at index x
4545
a.Config.App.SavedPosts = append(a.Config.App.SavedPosts[:x], a.Config.App.SavedPosts[x+1:]...)
4646
// Persist the config change
47-
err := config.SaveConfig(a.Config, "")
47+
err := config.SaveConfig(a.Config)
4848
if err != nil {
4949
log.Printf("failed to save config: %v", err)
5050
return nil

internal/config/config.go

Lines changed: 59 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type Config struct {
3838
// GetConfigPath returns the OS-appropriate config file path for tblogs
3939
const defaultConfigFile = "data.yml"
4040

41-
func GetConfigPath() (string, error) {
41+
func getConfigPath() (string, error) {
4242
configDir, err := os.UserConfigDir()
4343
if err != nil {
4444
return "", err
@@ -52,42 +52,17 @@ func GetConfigPath() (string, error) {
5252
return filepath.Join(tblogsDir, defaultConfigFile), nil
5353
}
5454

55-
func loadDefaultBlogsYAML(path string) ([]Blog, error) {
56-
f, err := os.Open(path)
55+
// LoadConfig loads the YAML config from the given path (or default path if empty) and returns a Config struct
56+
func LoadConfig() (*Config, error) {
57+
path, err := getConfigPath()
5758
if err != nil {
5859
return nil, err
5960
}
6061

61-
defer func() {
62-
if err := f.Close(); err != nil {
63-
log.Printf("failed to close file: %v", err)
64-
}
65-
}()
66-
67-
var blogs []Blog
68-
69-
decoder := yaml.NewDecoder(f)
70-
if err := decoder.Decode(&blogs); err != nil {
71-
return nil, err
72-
}
73-
74-
return blogs, nil
75-
}
76-
77-
// LoadConfig loads the YAML config from the given path (or default path if empty) and returns a Config struct
78-
func LoadConfig(path string) (*Config, error) {
79-
if path == "" {
80-
var err error
81-
path, err = GetConfigPath()
82-
if err != nil {
83-
return nil, err
84-
}
85-
}
86-
8762
f, err := os.Open(path)
8863
if err != nil {
8964
if os.IsNotExist(err) {
90-
blogs, err := loadDefaultBlogsYAML("internal/config/default-blogs.yml")
65+
blogs, err := loadDefaultBlogs()
9166
if err != nil {
9267
return nil, err
9368
}
@@ -103,7 +78,7 @@ func LoadConfig(path string) (*Config, error) {
10378
}
10479

10580
// Save the default config
106-
if err := SaveConfig(cfg, path); err != nil {
81+
if err := SaveConfig(cfg); err != nil {
10782
return nil, err
10883
}
10984

@@ -126,22 +101,68 @@ func LoadConfig(path string) (*Config, error) {
126101
return nil, err
127102
}
128103

104+
// Sync blogs with defaults
105+
if err := cfg.syncBlogs(); err != nil {
106+
log.Printf("warning: failed to sync blogs: %v", err)
107+
// Don't fail the load, just log the warning
108+
}
109+
129110
cfg.App.CurrentLogin = time.Now()
130111

131112
return &cfg, nil
132113
}
133114

134-
// SaveConfig writes the config struct to the given YAML file path (or default path if empty)
135-
func SaveConfig(cfg *Config, path string) error {
136-
if path == "" {
137-
var err error
115+
func loadDefaultBlogs() ([]Blog, error) {
116+
f, err := os.Open("internal/config/default-blogs.yml")
117+
if err != nil {
118+
return nil, err
119+
}
138120

139-
path, err = GetConfigPath()
140-
if err != nil {
141-
return err
121+
defer func() {
122+
if err := f.Close(); err != nil {
123+
log.Printf("failed to close file: %v", err)
124+
}
125+
}()
126+
127+
var blogs []Blog
128+
129+
decoder := yaml.NewDecoder(f)
130+
if err := decoder.Decode(&blogs); err != nil {
131+
return nil, err
132+
}
133+
134+
return blogs, nil
135+
}
136+
137+
func (cfg *Config) syncBlogs() error {
138+
defaultBlogs, err := loadDefaultBlogs()
139+
if err != nil {
140+
return err
141+
}
142+
143+
// Create a map of existing blogs by name for quick lookup
144+
existingBlogs := make(map[string]Blog)
145+
for _, blog := range cfg.Blogs {
146+
existingBlogs[blog.Name] = blog
147+
}
148+
149+
// Add missing blogs from default
150+
for _, defaultBlog := range defaultBlogs {
151+
if _, exists := existingBlogs[defaultBlog.Name]; !exists {
152+
cfg.Blogs = append(cfg.Blogs, defaultBlog)
142153
}
143154
}
144155

156+
return nil
157+
}
158+
159+
// SaveConfig writes the config struct to the given YAML file path (or default path if empty)
160+
func SaveConfig(cfg *Config) error {
161+
path, err := getConfigPath()
162+
if err != nil {
163+
return err
164+
}
165+
145166
f, err := os.Create(path)
146167
if err != nil {
147168
return err

internal/config/default-blogs.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,6 @@
140140
feed: https://triplebyte.com/blog/feed
141141
- name: PureCore
142142
feed: https://purecore.ro/feed/rss.xml
143-
- name: GitHub Blog
144-
feed: https://github.blog/feed/
145143
- name: Stack Overflow Blog
146144
feed: https://stackoverflow.blog/feed/
147145
- name: Google Developers Blog

0 commit comments

Comments
 (0)