package tinyvm import java.security.MessageDigest import java.time.Instant abstract class Object( val type: String, ) { abstract val data: String fun hash(): String = MessageDigest .getInstance("SHA-1") .digest("$type ${data.length}\u0000$data".toByteArray()) .toHex() } class Commit( val tree: Tree, val author: Author, val message: String, val timestamp: Instant, ) : Object("commit") { // Use \n\n for end of header in-case additional metadata is implemented in the future. override val data: String get() = "tree ${tree.hash()}\nauthor $author\ntimestamp ${timestamp.epochSecond}\n\n$message" } data class Author( val name: String, val email: String, ) { override fun toString(): String = "$name <$email>" }