<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
# frozen_string_literal: true

module Gem
  module SafeMarshal
    module Elements
      class Element
      end

      class Symbol < Element
        def initialize(name)
          @name = name
        end
        attr_reader :name
      end

      class UserDefined < Element
        def initialize(name, binary_string)
          @name = name
          @binary_string = binary_string
        end

        attr_reader :name, :binary_string
      end

      class UserMarshal < Element
        def initialize(name, data)
          @name = name
          @data = data
        end

        attr_reader :name, :data
      end

      class String < Element
        def initialize(str)
          @str = str
        end

        attr_reader :str
      end

      class Hash < Element
        def initialize(pairs)
          @pairs = pairs
        end

        attr_reader :pairs
      end

      class HashWithDefaultValue < Hash
        def initialize(pairs, default)
          super(pairs)
          @default = default
        end

        attr_reader :default
      end

      class Array < Element
        def initialize(elements)
          @elements = elements
        end

        attr_reader :elements
      end

      class Integer < Element
        def initialize(int)
          @int = int
        end

        attr_reader :int
      end

      class True < Element
        def initialize
        end
        TRUE = new.freeze
      end

      class False < Element
        def initialize
        end

        FALSE = new.freeze
      end

      class WithIvars < Element
        def initialize(object, ivars)
          @object = object
          @ivars = ivars
        end

        attr_reader :object, :ivars
      end

      class Object < Element
        def initialize(name)
          @name = name
        end
        attr_reader :name
      end

      class Nil < Element
        NIL = new.freeze
      end

      class ObjectLink < Element
        def initialize(offset)
          @offset = offset
        end
        attr_reader :offset
      end

      class SymbolLink < Element
        def initialize(offset)
          @offset = offset
        end
        attr_reader :offset
      end

      class Float < Element
        def initialize(string)
          @string = string
        end
        attr_reader :string
      end

      class Bignum < Element # rubocop:disable Lint/UnifiedInteger
        def initialize(sign, data)
          @sign = sign
          @data = data
        end
        attr_reader :sign, :data
      end

      class UserClass < Element
        def initialize(name, wrapped_object)
          @name = name
          @wrapped_object = wrapped_object
        end
        attr_reader :name, :wrapped_object
      end
    end
  end
end
