private static void Go(CsvStreamTransformer rewriter, FileInfo inputFile, FileInfo outputFile, char delimiter)
 {
     using (var source = inputFile.OpenRead())
         using (var output = outputFile.OpenWrite())
             using (var result = rewriter.Go(source, delimiter))
                 result.CopyTo(output);
 }
        static int Main(string[] args)
        {
            Parameters parameters;

            try
            {
                var arguments = Andy.Cmd.ArgumentParser.ParseArguments(args);

                if (arguments.ContainsKey(Parameter.Keys.Help))
                {
                    Parameter.PrintInstructions(Console.WriteLine);
                    return(0);
                }

                parameters = Parameter.GetParametersOrThrow(arguments);
            }
            catch (Exception e)
            {
                Console.Error.WriteLine("There's a problem with command parameters:");
                Console.Error.WriteLine(e.Message);
                Parameter.PrintInstructions(Console.Error.WriteLine);
                return(-2);
            }

            Settings settings;

            try
            {
                settings = Andy.Cmd.JasonFileParser.ParseContents <Settings>(
                    new FileInfo(settingsFileName));
            }
            catch (Exception e)
            {
                Console.Error.WriteLine("There's a problem with a settings file:");
                Console.Error.WriteLine(e.Message);
                return(-50);
            }

            try
            {
                var transformers = Setup.Profile.GetTransformerChain(settings.Profiles, parameters.ProfileName);

                var rewriter = new CsvStreamTransformer(
                    new Serialization.RowStringifier(
                        new Serialization.CellValueEncoder()),
                    new MultiTransformer(transformers),
                    new IO.CsvDocumentByteStreamReader(
                        new IO.RowLengthValidatingCsvRowByteStreamReader(
                            new IO.CsvReenumerableRowByteStreamReader(
                                new IO.CsvRowByteStreamReader(
                                    new IO.CellByteStreamReader(
                                        new Serialization.RowParser(settings.CsvDelimiter)),
                                    new IO.StreamReaderFactory(),
                                    new IO.StreamReaderPositionReporter()))),
                        new ArrayValueUniquenessChecker()));

                Go(rewriter,
                   parameters.SourceFile,
                   parameters.ResultFile,
                   settings.CsvDelimiter);

                return(0);
            }
            catch (Exception e)
            {
                Console.Error.WriteLine("Unexpected error:");

                Andy.Cmd.ConsoleUtils.PrintErrorDetails(e);

                return(-1);
            }
        }