Skip to content

Commit

Permalink
add custom parse error
Browse files Browse the repository at this point in the history
  • Loading branch information
danini-the-panini committed Jan 15, 2025
1 parent 97d3059 commit dff3047
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 27 deletions.
6 changes: 3 additions & 3 deletions lib/kdl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def self.parse(input, version: default_version, output_version: default_output_v
when nil
auto_parse(input, output_version:, **options)
else
raise UnsupportedVersionError.new("Unsupported version '#{version}'", version)
raise UnsupportedVersionError.new("unsupported version '#{version}'", version)
end
end

Expand All @@ -46,7 +46,7 @@ def self.auto_parse(input, output_version: default_output_version, **options)
parse(input, version: 2, output_version: output_version || 2, **options)
rescue VersionMismatchError => e
parse(input, version: e.version, output_version: output_version || e.version, **options)
rescue Tokenizer::Error, Racc::ParseError => e
rescue ParseError => e
parse(input, version: 1, output_version: output_version || 1, **options) rescue raise e
end

Expand All @@ -55,7 +55,7 @@ def self.output_module(version)
when 1 then KDL::V1
when 2 then KDL
else
warn "Unknown output_version `#{version}', defaulting to v2"
warn "[WARNING] Unknown output_version '#{version}', defaulting to v2"
KDL
end
end
Expand Down
23 changes: 18 additions & 5 deletions lib/kdl/error.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
# frozen_string_literal: true

module KDL
class Error < StandardError; end
class Error < StandardError
attr_reader :filename, :line, :column

def initialize(message, filename = nil, line = nil, column = nil)
message += " (#{line}:#{column})" if line
message = "#{[filename, line, column].compact.join(':')}: #{message}" if filename
super(message)
@filename = filename
@line = line
@column = column
end
end

class VersionMismatchError < Error
attr_reader :version, :parser_version

def initialize(message, version = nil, parser_version = nil)
super(message)
def initialize(message, version = nil, parser_version = nil, filename = nil)
super(message, filename, 1, 1)
@version = version
@parser_version = parser_version
end
Expand All @@ -16,9 +27,11 @@ def initialize(message, version = nil, parser_version = nil)
class UnsupportedVersionError < Error
attr_reader :version

def initialize(message, version = nil)
super(message)
def initialize(message, version = nil, filename = nil)
super(message, filename, 1, 1)
@version = version
end
end

class ParseError < Error; end
end
6 changes: 5 additions & 1 deletion lib/kdl/parser_common.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@ def next_token
def check_version
return unless doc_version = @tokenizer.version_directive
if doc_version != parser_version
raise VersionMismatchError.new("Version mismatch, document specified v#{doc_version}, but this is a v#{parser_version} parser", doc_version, parser_version)
raise VersionMismatchError.new("version mismatch, document specified v#{doc_version}, but this is a v#{parser_version} parser", doc_version, parser_version)
end
end

def on_error(t, val, vstack)
raise KDL::ParseError.new("unexpected #{token_to_str(t)} #{val&.value.inspect}", @tokenizer.filename, val&.line, val&.column)
end
end
end
18 changes: 2 additions & 16 deletions lib/kdl/tokenizer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,6 @@

module KDL
class Tokenizer
class Error < ::KDL::Error
attr_reader :filename, :line, :column

def initialize(message, filename = nil, line = nil, column = nil)
message += " (#{line}:#{column})" if line
message = "#{[filename, line, column].compact.join(':')}: #{message}" if filename
super(message)
@filename = filename
@line = line
@column = column
end
end

class Token
attr_reader :type, :value, :line, :column, :meta

Expand All @@ -37,7 +24,6 @@ def ==(other)
def to_s
"#{value.inspect} (#{line}:#{column})"
end
alias inspect to_s
end

attr_reader :index, :filename
Expand Down Expand Up @@ -496,9 +482,9 @@ def traverse_to(i)

def raise_error(error)
case error
when String then raise Error.new(error, @filename, @line, @column)
when String then raise ParseError.new(error, @filename, @line, @column)
when Error then raise error
else raise Error.new(error.message, @filename, @line, @column)
else raise ParseError.new(error.message, @filename, @line, @column)
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/kdl/v1/value.rb
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def self.from(value)
when ::Float then Float.new(value)
when TrueClass, FalseClass then Boolean.new(value)
when NilClass then Null
else raise Error("Unsupported value type: #{value.class}")
else raise Error("unsupported value type: #{value.class}")
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/kdl/value.rb
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ def self.from(value)
when ::Float then Float.new(value)
when TrueClass, FalseClass then Boolean.new(value)
when NilClass then Null
else raise Error("Unsupported value type: #{value.class}")
else raise Error("unsupported value type: #{value.class}")
end
end
end
Expand Down

0 comments on commit dff3047

Please sign in to comment.