require "yaml" module Backlog # The parsed contents of a repo's `.cc-os/config` (YAML). Only the # `board` key matters to the resolver: an explicit board-name override. # Never touches the filesystem itself — callers read the file and pass # its contents (or nil, if absent) in. class Config def initialize(contents) @data = contents.to_s.strip.empty? ? {} : (YAML.safe_load(contents) || {}) rescue Psych::SyntaxError @data = {} end # @return [String, nil] the explicit board name override, if configured def board @data["board"] end # @return [String, nil] the tracker key (e.g. "forgejo:owner/repo"), if configured def tracker @data["tracker"] end def configured? = !board.nil? def tracker_configured? = !tracker.nil? # @return [Hash] a copy of the parsed config data def to_h = @data.dup # Return new YAML contents with `key` set to `value`, preserving every # other key already present in `contents`. Pure — does not touch the # filesystem; callers read/write the file themselves. # # @param contents [String, nil] existing raw `.cc-os/config` contents # @param key [String, Symbol] key to set # @param value [Object] value to set it to # @return [String] the updated YAML contents def self.merge(contents, key, value) data = new(contents).to_h data[key.to_s] = value YAML.dump(data) end end end