#ifndef SWIG_LIBCORPUS2_TOKENWRITER_I
#define SWIG_LIBCORPUS2_TOKENWRITER_I

%module libcorpustokenwriter
%{
  #include <libcorpus2/io/writer.h>
%}

%include "tag.i"
%include "token.i"
%include "chunk.i"
%include "tagset.i"
%include "sentence.i"
%include "std_string.i"
%include "boost_shared_ptr.i"

%nodefaultctor Corpus2::TokenWriter;

%template(TokenWriterPtr) boost::shared_ptr<Corpus2::TokenWriter>;
%template(ConstTokenWriterPtr) boost::shared_ptr<const Corpus2::TokenWriter>;

namespace Corpus2 {
  class TokenWriter {
  public:
    typedef boost::shared_ptr<TokenWriter> TokenWriterPtr;
    /* --------------------------------------------------------------------- */

    TokenWriter();
    // TokenWriter(std::ostream& os, const Tagset& tagset, const string_range_vector& params);
    ~TokenWriter();
    
    /* --------------------------------------------------------------------- */
    virtual void write_token(const Token& t) = 0;
    void write_token_dispose(Token* t);
    virtual void write_sentence(const Sentence& s) = 0;
    virtual void write_chunk(const Chunk& p) = 0;

    /* --------------------------------------------------------------------- */
    // std::ostream& os();
    const Tagset& tagset();
    void finish();

    /* --------------------------------------------------------------------- */
    const Tagset& tagset() const;
    static std::vector<std::string> available_writer_types();

    /* --------------------------------------------------------------------- */
    static std::string writer_help(const std::string& class_id);
    static std::vector<std::string> available_writer_types_help();

    /* --------------------------------------------------------------------- */
    %exception {
      try {
        $action
      } catch (PwrNlp::PwrNlpError &e) {
        PyErr_SetString(PyExc_IndexError, e.info().c_str());
        return NULL;
      }
    }
    %feature("autodoc", "1");
    static TokenWriterPtr create_stream_writer(
      const std::string& class_id_params, 
      std::ostream& os, const Tagset& 
      tagset);

    %exception {
      try {
        $action
      } catch (PwrNlp::PwrNlpError &e) {
        PyErr_SetString(PyExc_IndexError, e.info().c_str());
        return NULL;
      }
    }
    %feature("autodoc", "1");
    static TokenWriterPtr create_path_writer(
      const std::string& class_id_params,
      const std::string& path,
      const Tagset& tagset);
  };

%extend TokenWriter {
    %exception {
      try {
        $action
      } catch (PwrNlp::PwrNlpError &e) {
        PyErr_SetString(PyExc_IndexError, e.info().c_str());
        return NULL;
      }
    }
	%feature("autodoc", "1");
	static TokenWriterPtr create_stdout_writer(
			const std::string& class_id_params, const Tagset& tagset) {
		return Corpus2::TokenWriter::create_stream_writer(class_id_params, std::cout, tagset);
	}

	void write_token(boost::shared_ptr<Corpus2::Token> t) {
		self->write_token(*t);
	}
	void write_sentence(boost::shared_ptr<Corpus2::Sentence> s) {
		self->write_sentence(*s);
	}
	void write_chunk(boost::shared_ptr<Corpus2::Chunk> c) {
		self->write_chunk(*c);
	}
}
}


using namespace std;
using namespace Corpus2;

#endif /* SWIG_LIBCORPUS2_TOKENWRITER_I */