Sha256: a5d3dea7c899b50a8786ccd96ab1923081f21f3db5b4eb7c90bb543489b78e15

Contents?: true

Size: 1.63 KB

Versions: 2

Compression:

Stored size: 1.63 KB

Contents

#include "attributes_iterator.h"

static ID attributes_id = 0;
static ID types_id = 0;
static ID values_id = 0;

VALUE read_attributes(VALUE obj) {
  return rb_ivar_get(obj, attributes_id);
}

VALUE panko_read_lazy_attributes_hash(VALUE object) {
  VALUE attributes_set = read_attributes(object);
  if (attributes_set == Qnil) {
    return Qnil;
  }

  VALUE attributes_hash = read_attributes(attributes_set);
  if (attributes_hash == Qnil) {
    return Qnil;
  }

  return attributes_hash;
}

void panko_read_types_and_value(VALUE attributes_hash,
                                VALUE* types,
                                VALUE* values) {
  *types = rb_ivar_get(attributes_hash, types_id);
  *values = rb_ivar_get(attributes_hash, values_id);
}

VALUE panko_each_attribute(VALUE obj,
                           SerializationDescriptor descriptor,
                           VALUE attributes,
                           EachAttributeFunc func,
                           VALUE context) {
  VALUE attributes_hash = panko_read_lazy_attributes_hash(obj);
  if(attributes_hash == Qnil) {
    return Qnil;
  }

  VALUE types, values;
  panko_read_types_and_value(attributes_hash, &types, &values);

  int i;
  for (i = 0; i < RARRAY_LEN(attributes); i++) {
    VALUE member = rb_sym2str(RARRAY_AREF(attributes, i));

    VALUE value = rb_hash_aref(values, member);
    VALUE type_metadata = rb_hash_aref(types, member);

    func(obj, member, value, type_metadata, context);
  }

  return Qnil;
}

void panko_init_attributes_iterator(VALUE mPanko) {
  attributes_id = rb_intern("@attributes");
  values_id = rb_intern("@values");
  types_id = rb_intern("@types");
}

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
panko_serializer-0.1.2 ext/panko_serializer/attributes_iterator.c
panko_serializer-0.1.1 ext/panko_serializer/attributes_iterator.c