Skip to content
Snippets Groups Projects
queue.go 1.12 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jonas Leder's avatar
    Jonas Leder committed
    package queue
    
    import (
    	"encoding/json"
    	"fmt"
    	"os"
    )
    
    type Queue struct {
    	Elements []string
    	FilePath string
    }
    
    func NewQueue(filePath string) (*Queue, error) {
    	q := &Queue{
    		Elements: make([]string, 0),
    		FilePath: filePath,
    	}
    
    	// Load state from file
    	if _, err := os.Stat(filePath); err == nil {
    		data, err := os.ReadFile(filePath)
    		if err != nil {
    			return nil, fmt.Errorf("error reading state file: %w", err)
    		}
    		if err := json.Unmarshal(data, &q.Elements); err != nil {
    			return nil, fmt.Errorf("error parsing state file: %w", err)
    		}
    	}
    	return q, nil
    }
    
    func (q *Queue) Enqueue(element string) {
    	q.Elements = append(q.Elements, element)
    }
    
    func (q *Queue) Dequeue() (string, error) {
    	if len(q.Elements) == 0 {
    		return "", fmt.Errorf("queue is empty")
    	}
    	element := q.Elements[0]
    	q.Elements = q.Elements[1:]
    	return element, nil
    }
    
    func (q *Queue) Save() error {
    	data, err := json.Marshal(q.Elements)
    	if err != nil {
    		return fmt.Errorf("error serializing state: %w", err)
    	}
    	if err := os.WriteFile(q.FilePath, data, 0644); err != nil {
    		return fmt.Errorf("error writing state to file: %w", err)
    	}
    	return nil
    }