// Copyright (C) 2021 nytpu // SPDX-License-Identifier: AGPL-3.0-or-later // For more license details, see LICENSE or . // This file incorporates code from makeworld's amfora: // https://github.com/makeworld-the-better-one/amfora/blob/master/subscriptions/structs.go // Original source is Copyright 2020 makeworld and is licensed under the // terms of the GNU General Public License Version 3.0. // https://www.gnu.org/licenses/gpl-3.0-standalone.html // package core implements the structs and other necessary resources for storing // and managing feeds and pages package core import ( "encoding/json" "fmt" "io/ioutil" "os" "path/filepath" "sync" ) // Global instance of FullData var Data = FullData{ FeedsMu: &sync.RWMutex{}, PagesMu: &sync.RWMutex{}, // Maps are created in init() } // have to do this instead of the automatically called init() because // initialization stuff requires parsing of command line args first func Init(dataPath string) error { f, err := os.Open(filepath.Join(dataPath, "comitium.json")) if err == nil { // File exists and could be opened fi, err := f.Stat() if err == nil && fi.Size() > 0 { // File is not empty jsonBytes, err := ioutil.ReadAll(f) f.Close() if err != nil { return fmt.Errorf("read comitium.json error: %w", err) } err = json.Unmarshal(jsonBytes, &Data) if err != nil { return fmt.Errorf("comitium.json is corrupted: %w", err) } } f.Close() } else if !os.IsNotExist(err) { // There's an error opening the file, but it's not bc is doesn't exist return fmt.Errorf("open comitium.json error: %w", err) } if Data.Feeds == nil { Data.Feeds = make(map[string]*Feed) } if Data.Pages == nil { Data.Pages = make(map[string]*Page) } return nil } func (d *FullData) WriteJSON(dataPath string) error { d.Lock() jsonBytes, err := json.MarshalIndent(&d, "", "\t") d.Unlock() if err != nil { return err } err = ioutil.WriteFile(filepath.Join(dataPath, "comitium.json"), jsonBytes, 0666) if err != nil { return err } return nil }