public static Task Execute(SliceCommand command, ILogger logger)
        {
            if (File.Exists(command.Input) == false)
            {
                logger.Fatal("Provided cloud point data file does not exist!");
                Environment.Exit(0);
            }

            using var streamReader = FileFormatDetector.GetCloudStreamReader(command.Input);
            if (streamReader == null)
            {
                logger.Fatal("Not supported data format.");
                Environment.Exit(0);
            }

            if (File.Exists(command.TerrainPath) == false)
            {
                logger.Fatal("Terrain file does not exist!");
                Environment.Exit(0);
            }

            var cloud   = new Cloud(streamReader);
            var terrain = Terrain.Import(command.TerrainPath);


            var slices = cloud.Slice(command.SliceHeight).Where(slice => slice != null).OrderBy(slice => slice.Height).ToList();

            foreach (var pointSlice in slices)
            {
                foreach (var pointSet in pointSlice.PointSets)
                {
                    foreach (var point in pointSet)
                    {
                        point.Z -= terrain.GetHeight(point);
                    }
                }
            }
            using var writer = new GpdWriter(command.Output, null, (float)command.SliceHeight);
            writer.WriteSlices(slices);

            return(Task.CompletedTask);
        }