Bash, Powershell, ou ... ?

Cette semaine, c'est Jonathan qui vous propose un #KataOfTheWeek : Un shell pas comme les autres

Briefing du Kata : Un shell est l'interface la plus basique entre un utilisateur et un système d'exploitation. Vous en utilisez un probablement tous les jours mêmes : Bash, Zsh, Fish, Powershell, … il en existe une multitude. Il est tout à fait possible de proposer une implémentation de son propre shell, mais ce n'est pas non plus quelque chose de trivial. Si c'est un sujet qui vous intéresse, vous pouvez trouver différentes ressources intéressantes sur le web (en voici une par exemple).

Aujourd'hui, on va déjà s'intéresser à une commande que vous exécutez probablement quotidiennement sur votre shell préféré : grep.

Saurez-vous lui trouver une implémentation ?

  • Données de test :

Soit le fichier languages qui représente une liste de langages :

Java
C
Javascript
C++
Kotlin
Rust
Python
PHP
Ruby
  • Implémentation cible :

Le but est d'implémenter la commande grep dans sa forme la plus simple : simple-grep [searchStr] [file] ou searchStr est la chaîne de caractère à rechercher et file le chemin du fichier dans lequel il faut rechercher cette chaîne. Essayer de penser au différents cas d'erreur possible !

  • Cas de tests proposés :
$ simple-grep Java languages
Java
Javascript

$ simple-grep P languages
Python
PHP

Évidemment, si vous le souhaitez, vous pouvez proposer une implémentation plus poussée qui permet de prendre en compte diverses options, en parsant les arguments passés en entrée. Peut-être dans un futur kata ?

Saurez-vous résoudre le problème ?

Bon courage !


Et voici une solution proposée par l'auteur en Kotlin:

class SimpleGrep {
    fun main(args: Array<String>) {
        kotlin.runCatching {
            val searchString = args[0]
            val file = args[1]
            if (searchString.isNotEmpty()) {
                File(file).useLines { lines ->
                    lines.filter { searchString in it }.forEach {
                        println(it)
                    }
                }
            }
        }.onFailure { err ->
            when (err) {
                is ArrayIndexOutOfBoundsException -> printUsage()
                is FileNotFoundException -> printNoSuchFile()
                else -> throw err
            }
        }
    }

    private fun printUsage() =
        println(
            """
            Two arguments expected
            Usage: simple-grep [searchStr] [file]
        """.trimIndent()
        )

    private fun printNoSuchFile() =
        println(
            """
            simple-grep: file passed as argument does not exist
        """.trimIndent()
        )
}

Votre équipe TakiVeille