middleman/middleman-core/lib/middleman-core/core_extensions/data/file_loader.rb

72 lines
1.6 KiB
Ruby

require 'yaml'
require 'json'
module Middleman
module CoreExtensions
module Data
# Load data files
class FileLoader
# No parser available
class NoFileLoaderFoundError < StandardError; end
# Load yaml files
class YamlFileLoader
def match?(file)
%w(.yaml .yml).include? File.extname(file)
end
# @param [Pathname] file
def load(file)
YAML.load_file(file)
rescue Psych::SyntaxError, StandardError => e
$stderr.puts %(Loading data file "#{file}" failed due to an error: #{e.message})
{}
end
end
# Load json files
class JsonFileLoader
def match?(file)
'.json' == File.extname(file)
end
# @param [Pathname] file
def load(file)
JSON.parse(file.read)
rescue => e
$stderr.puts %(Loading data file "#{file}" failed due to an error: #{e.message})
{}
end
end
# Default loader
#
# Always fails
class NilFileLoader
def match?(file)
raise NoFileLoaderFoundError
end
end
private
attr_reader :loaders
public
def initialize
@loaders = []
@loaders << YamlFileLoader.new
@loaders << JsonFileLoader.new
@loaders << NilFileLoader.new
end
# Load file using loader
def load(file)
loaders.find { |l| l.match? file }.load(file)
end
end
end
end
end