fun createHyperskillCourse()

in intellij-plugin/educational-core/src/com/jetbrains/edu/learning/stepik/hyperskill/courseGeneration/HyperskillOpenInIdeRequestHandler.kt [137:194]


  fun createHyperskillCourse(
    request: HyperskillOpenRequest,
    hyperskillLanguage: String,
    hyperskillProject: HyperskillProject
  ): Result<HyperskillCourse, CourseValidationResult> {
    val (languageId, languageVersion) = HyperskillLanguages.getLanguageIdAndVersion(hyperskillLanguage)
                                        ?: return Err(
                                          ValidationErrorMessage(
                                            EduCoreBundle.message(
                                              "hyperskill.unsupported.language",
                                              hyperskillLanguage
                                            )
                                          )
                                        )

    if (!hyperskillProject.useIde) {
      return Err(ValidationErrorMessageWithHyperlinks(EduCoreBundle.message("hyperskill.project.not.supported", HYPERSKILL_PROJECTS_URL)))
    }

    val eduEnvironment = hyperskillProject.eduEnvironment
                         ?: return Err(ValidationErrorMessage("Unsupported environment ${hyperskillProject.environment}"))

    if (request is HyperskillOpenStepWithProjectRequest) {
      // This condition is about opening e.g. Python problem with chosen Kotlin's project,
      // otherwise - open Kotlin problem in current Kotlin project itself later below
      if (hyperskillLanguage != hyperskillProject.language) {
        return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion))
      }

      // This is about opening Kotlin problem with currently chosen Android's project
      // But all Android projects are always Kotlin one's
      // So it should be possible to open problem in IntelliJ IDEA too e.g. (EDU-4641)
      if (eduEnvironment == EduNames.ANDROID && hyperskillLanguage == KOTLIN) {
        return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion))
      }

      // EDU-5994: if Step has a field 'framework' == 'Android', it should be opened only in Android Studio
      // as an Android project.
      val stepSource = getStepSource(request.stepId, request.isLanguageSelectedByUser)
      // When the user has selected project on Hyperskill, the Plugin has to check if it is an Android project,
      // if not: a new one should be created.
      if (stepSource.framework == EduNames.ANDROID && eduEnvironment != EduNames.ANDROID) {
        if (!EduUtilsKt.isAndroidStudio()) {
          return Err(ValidationErrorMessageWithHyperlinks(EduCoreBundle.message("rest.service.android.not.supported")))
        }
        return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion, EduNames.ANDROID))
      }

    }
    if (request is HyperskillOpenStepRequest) return Ok(HyperskillCourse(hyperskillLanguage, languageId, languageVersion))

    // Android projects must be opened in Android Studio only
    if (eduEnvironment == EduNames.ANDROID && !EduUtilsKt.isAndroidStudio()) {
      return Err(ValidationErrorMessageWithHyperlinks(EduCoreBundle.message("rest.service.android.not.supported")))
    }
    val hyperskillCourse = HyperskillCourseCreator.createHyperskillCourse(hyperskillProject, languageId, languageVersion, eduEnvironment)
    return Ok(hyperskillCourse)
  }