summaryrefslogtreecommitdiff
path: root/components/stream.rb
blob: 0a16ddeb42a8b0e3fb33ba9b13a817382b787a7f (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# frozen_string_literal: true

require 'stringio'

module NanoBot
  module Components
    class Stream < StringIO
      def write(*args)
        if @callback
          begin
            @accumulated += args.first
          rescue StandardError => _e
            @accumulated = "#{@accumulated.force_encoding('UTF-8')}#{args.first.force_encoding('UTF-8')}"
          end

          if @callback.arity == 3
            @callback.call(@accumulated, args.first, false)
          else
            @callback.call(@accumulated, args.first, false, args[1])
          end
        end
        super(args.first)
      end

      def callback=(block)
        @accumulated = ''
        @callback = block
      end

      def finish
        flush
        result = string.clone
        truncate(0)
        rewind

        if @callback
          if @callback.arity == 3
            @callback.call(@accumulated, nil, true)
          else
            @callback.call(@accumulated, nil, true, nil)
          end
          @callback = nil
          @accumulated = nil
        end

        result
      end
    end
  end
end