Class: Foxtail::Resource

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/foxtail/resource.rb

Overview

Container for parsed FTL entries (messages and terms).

Created via Resource.from_string or Resource.from_file, which use the runtime parser (Bundle::Parser) optimized for performance with error recovery. Invalid entries are silently skipped; comments are not preserved.

For full AST with source positions, comments, and error details, use Syntax::Parser instead.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(entries) ⇒ Resource

Returns a new instance of Resource.



48
49
50
# File 'lib/foxtail/resource.rb', line 48

def initialize(entries)
  @entries = entries
end

Instance Attribute Details

#entriesArray<Bundle::Parser::AST::Message, Bundle::Parser::AST::Term> (readonly)

Returns Parsed FTL entries (messages and terms).

Returns:



16
17
18
# File 'lib/foxtail/resource.rb', line 16

def entries
  @entries
end

Class Method Details

.from_file(path) ⇒ Foxtail::Resource

Parse FTL file into a Resource

Parameters:

  • path (Pathname)

    Path to FTL file

Returns:



43
44
45
46
# File 'lib/foxtail/resource.rb', line 43

def self.from_file(path)
  source = path.read
  from_string(source)
end

.from_string(source) ⇒ Foxtail::Resource

Parse FTL source string into a Resource

Examples:

Parse FTL content

source = <<~FTL
  hello = Hello, {$name}!
  goodbye = Goodbye!
FTL
resource = Foxtail::Resource.from_string(source)

Parameters:

  • source (String)

    FTL source text to parse

Returns:

Raises:

  • (ArgumentError)

    if source is not a String



30
31
32
33
34
35
36
37
# File 'lib/foxtail/resource.rb', line 30

def self.from_string(source)
  raise ArgumentError, "source must be a String, got #{source.class}" unless source.is_a?(String)

  parser = Bundle::Parser.new
  entries = parser.parse(source)

  new(entries)
end

Instance Method Details

#eachself

Iterate over entries

Returns:

  • (self)


64
65
66
67
# File 'lib/foxtail/resource.rb', line 64

def each(&)
  @entries.each(&)
  self
end

#empty?Boolean

Check if resource has any entries

Returns:

  • (Boolean)


56
# File 'lib/foxtail/resource.rb', line 56

def empty? = @entries.empty?

#find(id) ⇒ Bundle::Parser::AST::Message, ...

Find entry by ID



79
# File 'lib/foxtail/resource.rb', line 79

def find(id) = @entries.find {|entry| entry.id == id }

#messagesArray<Bundle::Parser::AST::Message>

Get message entries (IDs not starting with “-”)

Returns:



71
# File 'lib/foxtail/resource.rb', line 71

def messages = @entries.select {|entry| entry.id && !entry.id.start_with?("-") }

#sizeInteger

Get the number of entries

Returns:

  • (Integer)


60
# File 'lib/foxtail/resource.rb', line 60

def size = @entries.size

#termsArray<Bundle::Parser::AST::Term>

Get term entries (IDs starting with “-”)

Returns:



75
# File 'lib/foxtail/resource.rb', line 75

def terms = @entries.select {|entry| entry.id&.start_with?("-") }