noak 0.6.3

A library for reading and writing java class files
Documentation
use std::marker::PhantomData;

use crate::error::*;
use crate::mutf8::MString;
use crate::writer::{
    attributes::{AttributeWriter, AttributeWriterState},
    cpool,
    encoding::*,
};

impl<Ctx: EncoderContext> AttributeWriter<Ctx, AttributeWriterState::Start> {
    pub fn source_file<I>(
        mut self,
        file_name: I,
    ) -> Result<AttributeWriter<Ctx, AttributeWriterState::End>, EncodeError>
    where
        I: cpool::Insertable<cpool::Utf8>,
    {
        let length_writer = self.attribute_writer("SourceFile")?;
        let file_name_index = file_name.insert(&mut self.context)?;
        self.context.encoder().write(file_name_index)?;
        length_writer.finish(&mut self.context)?;
        Ok(AttributeWriter {
            context: self.context,
            _marker: PhantomData,
        })
    }

    pub fn source_debug_extension<I>(
        mut self,
        debug_extension: I,
    ) -> Result<AttributeWriter<Ctx, AttributeWriterState::End>, EncodeError>
    where
        I: Into<MString>,
    {
        let length_writer = self.attribute_writer("SourceDebugExtension")?;
        self.context.encoder().write(debug_extension.into().as_bytes())?;
        length_writer.finish(&mut self.context)?;
        Ok(AttributeWriter {
            context: self.context,
            _marker: PhantomData,
        })
    }

    pub fn synthetic(mut self) -> Result<AttributeWriter<Ctx, AttributeWriterState::End>, EncodeError> {
        self.attribute_writer("Synthetic")?.finish(&mut self.context)?;
        Ok(AttributeWriter {
            context: self.context,
            _marker: PhantomData,
        })
    }

    pub fn deprecated(mut self) -> Result<AttributeWriter<Ctx, AttributeWriterState::End>, EncodeError> {
        self.attribute_writer("Deprecated")?.finish(&mut self.context)?;
        Ok(AttributeWriter {
            context: self.context,
            _marker: PhantomData,
        })
    }

    pub fn signature<I>(mut self, signature: I) -> Result<AttributeWriter<Ctx, AttributeWriterState::End>, EncodeError>
    where
        I: cpool::Insertable<cpool::Utf8>,
    {
        let length_writer = self.attribute_writer("Signature")?;
        let signature_index = signature.insert(&mut self.context)?;
        self.context.encoder().write(signature_index)?;
        length_writer.finish(&mut self.context)?;
        Ok(AttributeWriter {
            context: self.context,
            _marker: PhantomData,
        })
    }
}