serde_magnus 0.10.0

Serde integration for Magnus
Documentation
use super::{enums::nest, Serializer};
use crate::error::Error;
use magnus::{RArray, Ruby, Value};
use serde::{ser::SerializeTupleVariant, Serialize};

pub struct TupleVariantSerializer<'r> {
    ruby: &'r Ruby,
    variant: &'static str,
    array: RArray,
}

impl<'r> TupleVariantSerializer<'r> {
    pub fn new(ruby: &'r Ruby, variant: &'static str, array: RArray) -> TupleVariantSerializer<'r> {
        TupleVariantSerializer {
            ruby,
            variant,
            array,
        }
    }
}

impl<'r> SerializeTupleVariant for TupleVariantSerializer<'r> {
    type Ok = Value;
    type Error = Error;

    fn serialize_field<Field>(&mut self, field: &Field) -> Result<(), Self::Error>
    where
        Field: Serialize + ?Sized,
    {
        self.array
            .push(field.serialize(Serializer::new(self.ruby))?)
            .map_err(Into::into)
    }

    fn end(self) -> Result<Self::Ok, self::Error> {
        nest(self.ruby, self.variant, self.array)
    }
}