Class: Omnizip::Models::FilterChain
- Inherits:
-
Object
- Object
- Omnizip::Models::FilterChain
- Defined in:
- lib/omnizip/models/filter_chain.rb
Overview
Ordered sequence of filters for compression/decompression
Manages a pipeline of filters that are applied in sequence. Filters are applied in reverse order during decode.
Constant Summary collapse
- MAX_FILTERS_XZ =
Maximum filters in XZ format
4- MAX_FILTERS_SEVEN_ZIP =
Maximum filters in 7z format
4
Instance Attribute Summary collapse
-
#filters ⇒ Array<FilterConfig>
readonly
Ordered filter configurations.
-
#format ⇒ Symbol
readonly
Format identifier (:xz, :seven_zip).
Instance Method Summary collapse
-
#add_filter(filter_attributes = {}) ⇒ self
Add a filter to the chain.
-
#decode_all(data, position = 0) ⇒ String
Decode data through all filters in reverse order.
-
#empty? ⇒ Boolean
Check if chain is empty.
-
#encode_all(data, position = 0) ⇒ String
Encode data through all filters in order.
-
#filter_ids ⇒ Array<Integer>
Get filter IDs for current format.
-
#initialize(attributes = {}) ⇒ FilterChain
constructor
Initialize filter chain.
-
#max_filters ⇒ Integer
Get maximum filters for current format.
-
#size ⇒ Integer
Get number of filters in chain.
-
#validate! ⇒ Boolean
Validate filter chain.
Constructor Details
#initialize(attributes = {}) ⇒ FilterChain
Initialize filter chain
48 49 50 51 |
# File 'lib/omnizip/models/filter_chain.rb', line 48 def initialize(attributes = {}) @format = attributes[:format] || :xz @filters = attributes[:filters] || [] end |
Instance Attribute Details
#filters ⇒ Array<FilterConfig> (readonly)
Returns Ordered filter configurations.
33 34 35 |
# File 'lib/omnizip/models/filter_chain.rb', line 33 def filters @filters end |
#format ⇒ Symbol (readonly)
Returns Format identifier (:xz, :seven_zip).
36 37 38 |
# File 'lib/omnizip/models/filter_chain.rb', line 36 def format @format end |
Instance Method Details
#add_filter(filter_attributes = {}) ⇒ self
Add a filter to the chain
60 61 62 63 64 65 |
# File 'lib/omnizip/models/filter_chain.rb', line 60 def add_filter(filter_attributes = {}) filter = FilterConfig.new(filter_attributes) filter.validate! @filters << filter self end |
#decode_all(data, position = 0) ⇒ String
Decode data through all filters in reverse order
111 112 113 114 115 116 117 118 |
# File 'lib/omnizip/models/filter_chain.rb', line 111 def decode_all(data, position = 0) result = data @filters.reverse_each do |filter_config| filter = filter_config.filter_instance result = filter.decode(result, position) end result end |
#empty? ⇒ Boolean
Check if chain is empty
130 131 132 |
# File 'lib/omnizip/models/filter_chain.rb', line 130 def empty? @filters.empty? end |
#encode_all(data, position = 0) ⇒ String
Encode data through all filters in order
97 98 99 100 101 102 103 104 |
# File 'lib/omnizip/models/filter_chain.rb', line 97 def encode_all(data, position = 0) result = data @filters.each do |filter_config| filter = filter_config.filter_instance result = filter.encode(result, position) end result end |
#filter_ids ⇒ Array<Integer>
Get filter IDs for current format
123 124 125 |
# File 'lib/omnizip/models/filter_chain.rb', line 123 def filter_ids @filters.map { |f| f.id_for_format(@format) } end |
#max_filters ⇒ Integer
Get maximum filters for current format
70 71 72 73 74 75 76 |
# File 'lib/omnizip/models/filter_chain.rb', line 70 def max_filters case @format when :xz then MAX_FILTERS_XZ when :seven_zip then MAX_FILTERS_SEVEN_ZIP else raise ArgumentError, "Unknown format: #{@format}" end end |
#size ⇒ Integer
Get number of filters in chain
137 138 139 |
# File 'lib/omnizip/models/filter_chain.rb', line 137 def size @filters.size end |
#validate! ⇒ Boolean
Validate filter chain
82 83 84 85 86 87 88 89 90 |
# File 'lib/omnizip/models/filter_chain.rb', line 82 def validate! if @filters.size > max_filters raise ArgumentError, "Too many filters for #{@format}: #{@filters.size} > #{max_filters}" end @filters.each(&:validate!) true end |