62f0c575/14/2026, 9:47:06 AM
.cr
Crystal
(text/x-crystal)
require "http/client/response"
require "./api/models/error_response"

module Docker
  # Base class for domain-specific errors.
  class DockerException < Exception; end

  class ApiError < DockerException
    def self.from_response(response : HTTP::Client::Response)
      if response.success?
        # Shouldn't ever be passed through here...
        raise ArgumentError.new "response is valid"
      else
        error = Api::Models::ErrorResponse.from_json response.body
        new response.status_code, error.message
      end
    end

    def initialize(@status_code, message = "")
      super message
    end

    getter status_code : Int32
  end

  class BuildError < DockerException
    def initialize(build_output : Array(String), message = "")
      @build_log = build_output.join

      super message
    end

    getter build_log : String
  end
end