elm-review/tests/MiscRules/ReadmeStartsWithProjectTitle.elm
2020-06-25 19:23:09 +02:00

81 lines
2.3 KiB
Elm

module MiscRules.ReadmeStartsWithProjectTitle exposing (rule)
import Elm.Package
import Elm.Project
import Elm.Syntax.Range exposing (Range)
import Review.Rule as Rule exposing (Error, Rule)
import Review.Rule3 as Rule3
rule : Rule
rule =
Rule3.newProjectRuleSchema "ReadmeStartsWithProjectTitle" initialProjectContext
|> Rule3.withElmJsonProjectVisitor elmJsonVisitor
|> Rule3.withReadmeProjectVisitor readmeVisitor
|> Rule3.fromProjectRuleSchema
type alias ProjectContext =
{ projectTitle : Maybe String
}
initialProjectContext : ProjectContext
initialProjectContext =
{ projectTitle = Nothing
}
-- elm.json VISITOR
elmJsonVisitor : Maybe { a | project : Elm.Project.Project } -> ProjectContext -> ( List nothing, ProjectContext )
elmJsonVisitor maybeProject projectContext =
case maybeProject |> Maybe.map .project of
Just (Elm.Project.Package pkg) ->
( [], { projectTitle = Just <| Elm.Package.toString pkg.name } )
_ ->
( [], projectContext )
-- README VISITOR
readmeVisitor : Maybe { readmeKey : Rule.ReadmeKey, content : String } -> ProjectContext -> ( List (Error scope), ProjectContext )
readmeVisitor maybeReadme context =
case ( maybeReadme, context.projectTitle ) of
( Just { readmeKey, content }, Just projectName ) ->
if not <| String.startsWith ("# " ++ projectName) content then
let
range : Range
range =
{ start = { row = 1, column = 1 }
, end =
{ row = 1
, column =
String.lines content
|> List.head
|> Maybe.withDefault ""
|> String.length
|> (+) 1
}
}
in
( [ Rule.errorForReadme readmeKey
{ message = "TODO"
, details = [ "TODO" ]
}
range
]
, context
)
else
( [], context )
_ ->
( [], context )