blob: d22dafef58f3d657a04d3e01199aa2ca04a1c631 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
module Qpid::Proton
# An AMQP error condition.
#
# An error sent across an AMQP connection has a name, description and optional extra info.
# The {Connectin}, {Session} and {Link} endpoint classes all have a #condition method to
# check for errors.
#
# {Condition} can also be raised as an exception.
#
class Condition < ProtonError
attr_reader :name, :description, :info
def initialize(name, description = nil, info = nil)
@name = name
@description = description
@info = info
super(to_s)
end
def to_s() "#{@name}: #{@description}"; end
def inspect() "#{self.class.name}(#{@name.inspect}, #{@description.inspect}, #{@info.inspect})"; end
def ==(other)
((other.is_a? Condition) &&
(other.name == self.name) &&
(other.description == self.description) &&
(other.info == self.info))
end
# Convert an object to a condition.
# @param obj the object to turn into a condition
# @param default_name name to use if obj does not imply a name
# @return [Condition] Conversion depends on the type of obj
# - Condition: return obj
# - Exception: return Condition(obj.class.name, obj.to_s)
# - String-like: return String.try_convert(obj)
# - nil: return nil
# @raise ::ArgumentError if obj is not convertible to {Condition}
def self.convert(obj, default_name="error")
case obj
when nil then nil
when Condition then obj
when Exception then Condition.new(obj.class.name, obj.to_s)
when SWIG::TYPE_p_pn_condition_t
if Cproton.pn_condition_is_set(obj)
Condition.new(Cproton.pn_condition_get_name(obj),
Cproton.pn_condition_get_description(obj),
Codec::Data.to_object(Cproton.pn_condition_info(obj)))
end
else
raise ::ArgumentError, "can't convert #{obj.class.name} to #{self.class.name}" unless obj.respond_to? :to_str
Condition.new(default_name, obj.to_str)
end
end
private
def self.assign(impl, cond)
Cproton.pn_condition_clear(impl)
if cond
cond = self.convert(cond)
Cproton.pn_condition_set_name(impl, cond.name) if cond.name
Cproton.pn_condition_set_description(impl, cond.description) if cond.description
Codec::Data.from_object(Cproton.pn_condition_info(impl), cond.info) if cond.info
end
end
end
end