2009-08-17 16:51:43 +02:00
/* sbt -- Simple Build Tool
* Copyright 2008 , 2009 Mark Harrah
*/
package xsbt
import java.io.File
trait PathMapper extends NotNull
{
def apply ( file : File ) : String
2009-08-29 16:19:00 +02:00
def apply ( files : Set [ File ] ) : Iterable [ ( File ,String ) ] = files . projection . map ( f => ( f , apply ( f ) ) )
2009-08-17 16:51:43 +02:00
}
2009-08-29 16:19:00 +02:00
final case class RelativePathMapper ( base : File ) extends PMapper ( file => FileUtilities . relativize ( base , file ) . getOrElse ( file . getPath ) )
final case object BasicPathMapper extends PMapper ( _ . getPath )
final case object FlatPathMapper extends PMapper ( _ . getName )
class PMapper ( val f : File => String ) extends PathMapper
2009-08-26 14:38:20 +02:00
{
2009-08-29 16:19:00 +02:00
def apply ( file : File ) : String = f ( file )
2009-08-26 14:38:20 +02:00
}
2009-08-17 16:51:43 +02:00
object PathMapper
{
2009-08-29 16:19:00 +02:00
val basic : PathMapper = BasicPathMapper
def relativeTo ( base : File ) : PathMapper = RelativePathMapper ( base )
val flat = FlatPathMapper
def apply ( f : File => String ) : PathMapper = new PMapper ( f )
2009-08-17 16:51:43 +02:00
}
2009-08-26 14:38:20 +02:00
trait FileMapper extends NotNull
{
def apply ( file : File ) : File
2009-08-29 16:19:00 +02:00
def apply ( files : Set [ File ] ) : Iterable [ ( File ,File ) ] = files . projection . map ( f => ( f , apply ( f ) ) )
2009-08-26 14:38:20 +02:00
}
class FMapper ( f : File => File ) extends FileMapper
2009-08-17 16:51:43 +02:00
{
def apply ( file : File ) = f ( file )
2009-08-26 14:38:20 +02:00
}
object FileMapper
{
def basic ( newDirectory : File ) = new FMapper ( file => new File ( newDirectory , file . getPath ) )
def rebase ( oldBase : File , newBase : File ) =
2009-11-09 15:34:52 +01:00
new FMapper ( file => if ( file == oldBase ) newBase else new File ( newBase , FileUtilities . relativize ( oldBase , file ) . getOrElse ( error ( file + " not a descendent of " + oldBase ) ) ) )
2009-08-26 14:38:20 +02:00
def flat ( newDirectory : File ) = new FMapper ( file => new File ( newDirectory , file . getName ) )
def apply ( f : File => File ) = new FMapper ( f )
2009-08-17 16:51:43 +02:00
}